CodeGuard-Fehler
-
Hallo zusammen,
CodeGuard spuckt mir die folgenden 2 Fehler aus:
Fehler 00038. 0x130C00 (Thread 0x0BB8): Methode für ungültig umgewandeltes Objekt aufgerufen: Versuch, auf 4 Byte(s) an 0x00576518 zuzugreifen.. Der 'this'-Zeiger zeigt auf Block 0x00576518(=Project1.exe:0x02:000518), der nur 1 Bytes lang ist. | c:\programme\embarcadero\rad studio\8.0\include\windows\rtl\ustring.h Zeile 78: | | // Constructors |> __fastcall UnicodeString(): Data(0) {} | __fastcall UnicodeString(const char* src); | __fastcall UnicodeString(const UnicodeString& src); Aufrufhierarchie: 0x00401C47(=Project1.exe:0x01:000C47) c:\programme\embarcadero\rad studio\8.0\include\windows\rtl\ustring.h#78 0x00402810(=Project1.exe:0x01:001810) Unit1.cpp#0 0x0041C490(=Project1.exe:0x01:01B490) 0x00566C0D(=Project1.exe:0x01:165C0D) 0x00566DE3(=Project1.exe:0x01:165DE3) ------------------------------------------ Fehler 00039. 0x130400 (Thread 0x0BB8): Zugriff Überlauf: Versuch, auf 4 Byte(s) an 0x00576518 zuzugreifen., an Block 0x00576518(=Project1.exe:0x02:000518), der nur 1 Bytes lang ist. | c:\programme\embarcadero\rad studio\8.0\include\windows\rtl\ustring.h Zeile 78: | | // Constructors |> __fastcall UnicodeString(): Data(0) {} | __fastcall UnicodeString(const char* src); | __fastcall UnicodeString(const UnicodeString& src); Aufrufhierarchie: 0x00401C64(=Project1.exe:0x01:000C64) c:\programme\embarcadero\rad studio\8.0\include\windows\rtl\ustring.h#78 0x00402810(=Project1.exe:0x01:001810) Unit1.cpp#0 0x0041C490(=Project1.exe:0x01:01B490) 0x00566C0D(=Project1.exe:0x01:165C0D) 0x00566DE3(=Project1.exe:0x01:165DE3)
Nach vielen Tests mit dem Debugger kann es nur an folgender Funktion liegen, welche ich hier http://www.bytesandmore.de/rad/cpp/snipp/sc03023.php entdeckt habe.
So sieht es also bei mir ausString GetSystemPath(int ilFolder) { wchar_t pfad[MAX_PATH]; LPITEMIDLIST pidl; SHGetSpecialFolderLocation(0, ilFolder, &pidl); SHGetPathFromIDList(pidl, pfad); return String(pfad); }
Aufruf z.B.
String test = GetSystemPath(CSIDL_APPDATA);
Kann hier jemand einen Fehler entdecken?
Benutze übrigens CBuilder XE.
Hoffe ich bekomme Hilfe!
-
gert_mue schrieb:
String GetSystemPath(int ilFolder) { wchar_t pfad[MAX_PATH]; LPITEMIDLIST pidl; SHGetSpecialFolderLocation(0, ilFolder, &pidl); SHGetPathFromIDList(pidl, pfad); return String(pfad); }
Aufruf z.B.
String test = GetSystemPath(CSIDL_APPDATA);
Kann hier jemand einen Fehler entdecken?
Zunächst mal sehe ich da ein Speicherleck. Du mußt pidl selbst freigeben:
MSDN SHGetSpecialFolderLocation() Parameters schrieb:
ppidl [out]
Type:PIDLIST_ABSOLUTE*
A PIDL specifying the folder's location relative to the root of the namespace (the desktop). It is the responsibility of the calling application to free the returned IDList by using CoTaskMemFree.
Quelle: http://msdn.microsoft.com/en-us/library/bb762203%28VS.85%29.aspx
Nach vielen Tests mit dem Debugger kann es nur an folgender Funktion liegen
Sehe ich nicht so. Ich kann den CodeGuard-Fehler zumindest nicht reproduzieren.
-
Erstmal vielen Dank mit dem Speicherleck.
1. Punkt: ist die MemFree-Funktion korrekt angewendet?
String GetSystemPath(int ilFolder) { wchar_t pfad[MAX_PATH]; LPITEMIDLIST pidl; SHGetSpecialFolderLocation(0, ilFolder, &pidl); SHGetPathFromIDList(pidl, pfad); CoTaskMemFree(pidl); return String(pfad); }
2. Punkt:
Habe herausgefunden, woran der CodeGuard-Fehler lag aber habe noch Fragen dazu. Also die Fehler tauchten bei folgenden Zeilen auf:String filepath = GetSystemPath(CSIDL_APPDATA) + "\\Mein Programm\\test.txt";
Der Fehler taucht nicht mehr auf wenn ich es so schreibe:
String filepath = String(GetSystemPath(CSIDL_APPDATA) + "\\Mein Programm\\test.txt");
Ist der Fehler für einen "Sachverständigen" so erklärbar und vor allem ist meine Lösung dazu in Ordnung?
-
Beide Lösungen sind ok, kann nichts Falsches daran erkennen.
-
gert_mue schrieb:
Habe herausgefunden, woran der CodeGuard-Fehler lag aber habe noch Fragen dazu. Also die Fehler tauchten bei folgenden Zeilen auf:
String filepath = GetSystemPath(CSIDL_APPDATA) + "\\Mein Programm\\test.txt";
Passiert bei mir immer noch nicht. Könntest du mal versuchen, eine Kopie deines Projektes auf ein Minimalbeispiel zu reduzieren, das den CodeGuard-Fehler reproduziert?
-
Hallo audacia,
also bei einem Minimalbeispiel funktioniert es, so wie du es sagst. Habe es bisher noch nicht geschafft die direkte Ursache im Projekt zu finden. Ist auch ziemlich umfangreich. Ich versuche es weiter und falls ich es noch herausbekomme, melde ich mich. Ansonsten funktioniert es ja mit dem String(...) und Fehler kommen zur Laufzeit ja auch nicht (läuft schon paar Jahre).
Ich danke trotzdem für deine Bemühungen
-
gert_mue schrieb:
Ich versuche es weiter und falls ich es noch herausbekomme, melde ich mich.
Das wäre nett