EAccessViolation?
-
Hallo
Vermutlich war es kein Speicherleck (reservierte Speicher nicht freigegeben) sondern eher ungültige Zeiger (Zugriff auf nichtreservierten und initialisierten Speicher).
Nichtsdestotrotz kann kein C++ Compiler alleine so was bestimmen, sondern nur die sogenannten Speicherzugriffsfehler auslösen. Es gibt Zusatztools wie Codeguard und den Debugger die helfen solche Fehler zu finden.bis bald
akari
-
Aktiviere mal CodeGuard.
-
aber vergiss nicht ihn zu deaktiviren wenn du das programm auch auf anderen rechnern verwenden willst
-
Oh, diesen CodeGuard noch nie benutzt. Mal eben getestet und muss sagen, wirklich was anfangen kann ich nicht damit.

Habe einen Fehler absichtlich eingebaut und er hat ihn auch angemeckert aber wo das im Quelltext steht darf ich durch Glaskugel selber rausfinden .
Wie soll sowas funktionieren?
-
wenn du den CodeGuard aktiviert hast, die Debug-Optionen auf Full Debug stehen, drück einfach F9 und arbeite mit deinem Programm, wenn der CodeGuard Fehler findet öffnet sich ein Fenster, welches die Fehlermeldung anzeigt und die Zeile im Quellcode wo der Fehler auftritt wird markiert.
Gleichzeitig schreibt der CodeGuard ein Log-File in das Verzeichnis wo die Exe steht (Endung .cgl), dort steht beim Full Debug auch die Zeilennummer in der der Fehler auftritt (die Zahl ganz am Ende einer Zeile)
-
Wenn du damit Probleme hast solltest du versuchen den Einsatz von rohen Zeigern so weit wie möglich zu vermeiden. Nutze statt dessen die Container der Standardbibliothek (vector, list), Stringklassen sowie Smartpointer (am besten von boost).
Damit beseitigst du schonmal die meisten Zugriffsprobleme und Speicherlecks.
-
Also ich habe CBUilder5 pro und es öffnet sich auch ein Fenster, aber weder steht dort eine Zeilennummer, noch wird die Zeile markiert noch steht eine Zeilennummer in der angelegten Datei.

Vielleicht gibt es diese Funktion erst mit CBuilder6? Oder muss ich noch etwas einstellen?
-
Projekt -> Optionen -> Compiler -> unter links "Voll-Debug"
was auch helfen kann: Einfach mal die CodeGuard Konfiguration (Menü "Tools") aufmachen, warten bis der Balken fertig ist und dann wieder auf OK.
-
Ahh, vielen Dank. Das ziemlich cool

Leider meldet er mir bei Programmende schlicht ein:Fehler 00001. 0x400000 (Thread 0x0F54): Exception 0xC0000005: Zugriffsverletzung bei 0x162350C. Aufrufhierarchie: 0x0CD1BAE3(=CG32.DLL:0x01:01AAE3) 0x0CD14BE9(=CG32.DLL:0x01:013BE9) 0x0CD142FE(=CG32.DLL:0x01:0132FE) 0x0CD1527E(=CG32.DLL:0x01:01427E) 0x0CD2492E(=CG32.DLL:0x01:02392E) 0x0CD010BB(=CG32.DLL:0x01:0000BB) ------------------------------------------
-
Ich habe jetzt alles ausgeklammert und mich schrittweise angetastet.
Ich habe dann ein neues Projekt erstellt, CodeGuard aktiviert und das der komplette Quelltext vom Test//--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { int handle = _rtl_open("xxx.txt",_O_RDONLY); _rtl_close(handle); } //---------------------------------------------------------------------------Fehler 00079. 0x820000 (Thread 0x0F5C):
Funktion fehlgeschlagen:
_rtl_open(0x004042EC ["xxx.txt"], 0x0 [0])=0xFFFFFFFF [-1]Aufrufhierarchie:
0x00402081(=Project1.exe:0x01:001081) C:\...\Unit1.cpp#21
0x4005ABFC(=VCL50.BPL:0x01:059BFC)
0x00401D55(=Project1.exe:0x01:000D55) C:\...\Project1.cpp#13
0x3257E14F(=CC3250MT.DLL:0x01:07D14F)------------------------------------------
Project1.cpp#13 => Application->CreateForm(__classid(TForm1), &Form1);
Kann mir das jemand bitte erklären?

Ich habe anschliessend das Beispiel aus der Hilfe zu _rtl_open genommen, produziert ebenfalls den Fehler. Kann ich davon ausgehen das dies ein CodeGuaard Bug ist?