access violation
-
HALLO.
ich habe ein problem mit meinem program, mit dem ich nichts anfangen kann. es geht darum, dass es jedes mal folgende fehlermeldung vor dem verlassen des programs gibt:
"Unbehandelte Ausnahme in File01.exe (MSVCRTD.DD): 0*C000005 Access Violation."danach soll ich den pfad von CBHEAB.C angegen.
kann mir vielleicht jemand weiterhelfen?
DANKE!
STICK.
-
Hast du womöglich versucht delete auf einen Speicherbereich anzuwenden, der dir gar nicht mehr gehört?
-
servus.
nein, dass kann leider nicht der fall sein. habe delete überhaupt nicht verwendet. habe dann aber später versucht, die fehlermeldung damit zu beseitigen, hat aber auch nicht geklappt.
was mich wundert ist, dass das program einmanfrei bis zum ende durchläuft und die ergebnisse auch alle hinhauen, nur dann am ende kommt egal diese fehlermeldung. keine ahnung, warum. muss man den delete einsetzen, wenn man sich mit new einige arrays geschaffen hat?
STICK.
-
stick_thai schrieb:
keine ahnung, warum. muss man den delete einsetzen, wenn man sich mit new einige arrays geschaffen hat?
Ja, sollte man (noch besser verwendet man bei Arrays übrigens delete[])
(btw, schau dir mal die Objekte an, mit denen du arbeitest - hat eventuell eins davon ein delete im Destruktor?)
-
CStoll (off) schrieb:
stick_thai schrieb:
keine ahnung, warum. muss man den delete einsetzen, wenn man sich mit new einige arrays geschaffen hat?
Ja, sollte man (noch besser verwendet man bei Arrays übrigens delete[])
Das ist nicht nur "noch besser", sondern die einzig richtige Form
(btw, schau dir mal die Objekte an, mit denen du arbeitest - hat eventuell eins davon ein delete im Destruktor?)
Und zusätzlich: da du mit Arrays arbeitest, schau mal ob deine Array-Zugriffe auch alle innerhalb der gültigen Grenzen sind (also im Bereich [0..n-1] wobei n die Größe des Arrays ist).
-
danke für die tips
delete[] habe ich sowieso angewandt. sieht das dann bei 2D arrays so aus?
int **A; .... delete [] A;
schau dir mal die Objekte an, mit denen du arbeitest - hat eventuell eins davon ein delete im Destruktor?
verwende keine objekte und habe daher auch keinen destruktor. arbeite nur mit strukturen, arrays, etc.
schau mal ob deine Array-Zugriffe auch alle innerhalb der gültigen Grenzen sind
ich denke hier wird irgendwo das problem sein. normalerweise, wenn die grenzen überschritten werden, bricht das program genau an der stelle im program ab. aber bei mir läuft es immer einwandfrei bis zum ende. kann es sein, dass irgendwie eine meiner funktionen im hintergrund läuft und wenn das program aussteigen will, dann kommt diese noch einmal und verändert meine arraywerte?
DANKE.
STICK.
-
stick_thai schrieb:
delete[] habe ich sowieso angewandt. sieht das dann bei 2D arrays so aus?
int **A; .... delete [] A;
Geht das auch etwas vollständiger? (interessant wäre zu wissen, ob zwischen diesen beiden Zeilen noch ein "new" steht)
-
jo. klar habe ich ein new verwendet. sieht in etwas so aus:
int **A; A = new int *[2]; A[0] = new int [4]; A[1] = new int [4];
oder aber so:
struct INTER_PIC { int *itsX; int *itsY; int *itsLas; int *itsCode; }; INTER_PIC *MIN_PIC; int *help1; help1 = new int [3]; for (k=0;k<3;k++) help1[k]=3; MIN_PIC = new INTER_PIC [3]; for (k=0;k<3;k++) { MIN_PIC[k].itsX = new int [help1[k]]; MIN_PIC[k].itsY = new int [help1[k]]; MIN_PIC[k].itsLas = new int [help1[k]]; MIN_PIC[k].itsCode = new int [help1[k]]; }
ich hoffe, das hilf euch, das problem zu lösen
STICK.
-
stick_thai schrieb:
jo. klar habe ich ein new verwendet. sieht in etwas so aus:
int **A; A = new int *[2]; A[0] = new int [4]; A[1] = new int [4];
Und am Ende hast du hoffentlich auf die richtige Reihenfolge geachtet:
delete[] A[0]; delete[] A[1]; delete[] A;
-
HI.
leider gibts, wenn ich genau so mache, wie du gesagt hast, ne neue fehlermeldung:
Debug Error! Damage: after Normal block (1970) at 0*00D81940.
ist es eigentlich egal, wo ich die delete[] ansetze? ich habe sie jetzt ganz am ende stehen.
DANKE!
STICK.
-
stick_thai schrieb:
Damage: after Normal block (1970) at 0*00D81940.
Du greifst irgendwo mit einem ungültigen Index auf dein Array zu.
-
gibt es denn eine methode, diesen ungünstigen index ausfindig zu machen?
-
stick_thai schrieb:
gibt es denn eine methode, diesen ungünstigen index ausfindig zu machen?
- Code genau angucken. Wenn das nicht hilft:
- Assert auf den Index vor jedem Zugriff.Ist dir überhaupt klar, dass der maximal erlaubte Index bei "new int [4]" 3 ist?
-
Ist dir überhaupt klar, dass der maximal erlaubte Index bei "new int [4]" 3 ist?
das war mir schon klar
okay. ich versuche nun, mit ASSERT der sache her zu werden. aber warum bricht das programm nicht an der stelle ab, wo der ungültige index verwendet wird? das verwundert mich etwas.
-
stick_thai schrieb:
das war mir schon klar
Ich wollte nur sichergehen. Das war hier schon sehr of die Ursache solcher Probleme
aber warum bricht das programm nicht an der stelle ab, wo der ungültige index verwendet wird?
Warum sollte es? Es gibt in C und C++ eben keine automatische Bereichsprüfung für Arrayindices. Die würde den, der sie nicht braucht, unnötig Zeit kosten, und wer sie braucht, kann sie einbauen oder z.B. std::vector::at benutzen.
-
hi.
das verstehe ich jetzt nicht ganz. wenn es keine automatische bereichsprüfung gibt, warum wird dann sowas nicht akzeptiert? ist doch auch ein ungültiger index.int A[2]; A[2]=0;
p.s.: mein ursprüngliches problem ist bereits gelöst. :p
-
stick_thai schrieb:
wenn es keine automatische bereichsprüfung gibt, warum wird dann sowas nicht akzeptiert?
Was heißt denn "wird nicht akzeptiert"?
p.s.: mein ursprüngliches problem ist bereits gelöst. :p
Woran lag's denn?
-
stick_thai schrieb:
hi.
das verstehe ich jetzt nicht ganz. wenn es keine automatische bereichsprüfung gibt, warum wird dann sowas nicht akzeptiert? ist doch auch ein ungültiger index.int A[2]; A[2]=0;
Der Compiler ist halt "dumm"
Und deshalb kümmert er auch nicht um die Bereichskontrollen (bei den vielen Nebenbedingungen, die da eintreten könnten, ist das zu undurchschaubar). Eventuell könnte ein anderer Compiler bei diesem Code eine Warnung rausspucken.
-
MFK schrieb:
Was heißt denn "wird nicht akzeptiert"?
"nicht akzeptiert" heisst bei mir, dass das programm abstürzt und sowas wie "ACCESS VIOLATION" ausgibt.
MFK schrieb:
Woran lag's denn?
gute frage. bin mir nicht so sicher. habe jedenfalls zuerst die funktion ausfindig gemacht, wegen der der fehler auftrat und dort den quellcode untersucht, bis ich auf die betreffende zeile gestossen bin. die habe ich dann einfach gelöscht und dann hats geklappt. ein grund könnte sein, dass ich (oder bzw. mein programm) in einem int array eventuell eine grössere zahl als 32767 speichern wollte. vielleicht siehst du ja einen fehler in diesem code:
for (i=0;i<GRP-2;i++) { help2[i][2]++; if (help2[i][2]==0) CHECK1(i); }
jetzt müsstest du dazu wissen, dass die funktion CHECK1 sich selber auch noch aufrufen kann, dass GRP in der regel nicht grösser als 100 ist und der startwert von help[i][2] ist -1. ich habe diese if bedingung eingebaut, damit die funktion CHECK1 für den gleichen wert nicht tausend mal aufgerufen wird und meine kostbare zeit verschwendet. wenn ich den code wie folgt umschreibe, klappts auch:
for (i=0;i<GRP-2;i++) CHECK1(i);