vector Problem
-
Hallo Leute,
Ich habe folgendes Problem: Ich habe mit VS2005 eine DLL erstellt die mir Files und Ordner packt und entpackt. Die entsprechende Funktion ist folgendermaßen deklariert:
__declspec(dllexport) BOOL ZipImages(tcharVec files, TCHAR* sourcePath, TCHAR* destination);..und implementiert:
BOOL ZipImages( tcharVec files, TCHAR* sourcePath, TCHAR* destination ) { _CrtCheckMemory(); const TCHAR* path = (const TCHAR*)destination; const char* pw = (const char*) ""; HZIP hz = CreateZip(path, pw); _CrtCheckMemory(); if (!hz) return FALSE; if (files.size() <= 0) return FALSE; for(int i=0; i<files.size();i++){ ZRESULT zr = ZipAdd(hz, (TCHAR*)PathFindFileName(files[i]), files[i]); _CrtCheckMemory(); if (zr != 0) { return FALSE; } } CloseZip(hz); _CrtCheckMemory(); return TRUE; //hier kommt der Fehler }tcharVec habe ich am Beginn meiner Header Datei so definiert:
typedef std::vector<TCHAR*> tcharVec;Wenn ich diese DLL in ein kleines Testprogramm einbinde und die Funktion ZipImages aufrufe funktioniert eigtl. alles fehlerfrei bis auf die return Anweisung. Bei der return Anweisung, genauer gesagt bei der Zerstörung des Vektors, erhalte ich einen Heap Fehler. Mit CrtCheckMemory() finde ich leider keinen Fehler, deshalb stehe ich immo etwas auf der Leitung. Auch mit den anderen Tipps aus Martin's Blog (Heap Fehler finden) bin ich nicht auf die Lösung meines Problems gekommen.
Das erstellte Archiv lässt sich problemlos öffnen und es sind auch alle Dateien enthalten. Bei den Projectsettings habe ich eingestellt MFC in einer statischen Bibliothek verwenden und in den cpp Files inkludiere ich die windows.h.
Irgendwie scheint mein Problem mit dem Vektor Objekt zu tun zu haben. Aber leider gehen mir nach 2 Tagen die Ideen aus.
Vielen Dank im Voraus!
lG
nac_
-
Wenn du in deinem vector pointer speicherst (TCHAR*), die du vermutlich
irgendwo mit new erstellt hast, dann vergißt du bei Programmende (hoffentlich)
nicht, diese auch mit delete zu zerstören.
-
gutes Argument

Ich dachte ich muss den Vektor nur im Hauptprogramm zerstören!
Ich habe die Funktion jetzt so umgeschrieben:
BOOL ZipImages( tcharVec files, TCHAR* sourcePath, TCHAR* destination ) { _CrtCheckMemory(); const TCHAR* path = (const TCHAR*)destination; const char* pw = (const char*) ""; HZIP hz = CreateZip(path, pw); _CrtCheckMemory(); if (!hz) return FALSE; if (files.size() <= 0) return FALSE; for(int i=0; i<files.size();i++){ ZRESULT zr = ZipAdd(hz, (TCHAR*)PathFindFileName(files[i]), files[i]); _CrtCheckMemory(); if (zr != 0) { return FALSE; } } CloseZip(hz); if(!_CrtCheckMemory()) return FALSE; for (UINT k = 0; k< files.size(); k++) { delete files[k]; //jetzt kommt hier der Fehler files[k] = 0; } files.erase(files.begin(), files.end()); return TRUE; }Allerdings bekomm ich jetzt wieder beim delete Operator einen Debug Assertion Error. _BLOCK_TYPE_IS_VALID schlägt fehl...
Anscheinend derselbe Fehler nur 2 Zeilen früher...
-
Bist Du sicher, dass Du 'tcharVec files' by value übergeben willst???
Und noch ein kleiner Verbesserungsvorschlag:
files.clear();statt
files.erase(files.begin(), files.end());
-
Meinst du statt dem vector einen Zeiger auf den Vektor übergeben?
Wäre wahrscheinlich effektiver bei großen Daten - ich werds ändern, aber ich glaube mein Fehler bleibt mir trotzdem erhalten.Danke für die Verbesserungsvorschläge!
lG
nac_
-
Also mein Problem scheint entweder mit dem Vector ansich, oder mit den Project Settings meiner DLL zu tun zu haben.
Folgender Code löst denselben Heap Fehler, immer beim Zerstören des Vektors, aus:typedef std::vector<TCHAR*> tcharVec; int main() { tcharVec srcVec; //files to compress srcVec.push_back((TCHAR*)"d:\\src\\test\\jpg\\MRT.jpg"); srcVec.push_back((TCHAR*)"d:\\src\\test\\jpg\\netzplan.jpg"); _CrtCheckMemory(); for (UINT k = 0; k< srcVec.size(); k++) { delete srcVec[k]; srcVec[k] = 0; } srcVec.clear(); return 0; }Ich habe keine Idee mehr wie ich dem Problem auf die Schliche kommen könnte.

-
Wo sind denn die zu den delete korrespondierenden new? Im push_back castest Du nur einen konstanten String, ein delete darauf *MUSS* in die Hose gehen.
-
nac_ schrieb:
Meinst du statt dem vector einen Zeiger auf den Vektor übergeben?
Wäre wahrscheinlich effektiver bei großen Daten - ich werds ändern, aber ich glaube mein Fehler bleibt mir trotzdem erhalten.Danke für die Verbesserungsvorschläge!
lG
nac_
Nicht Pointer, nimm eine REFERENZ!!!
-
nac_ schrieb:
Also mein Problem scheint entweder mit dem Vector ansich, oder mit den Project Settings meiner DLL zu tun zu haben.
Folgender Code löst denselben Heap Fehler, immer beim Zerstören des Vektors, aus:typedef std::vector<TCHAR*> tcharVec; int main() { tcharVec srcVec; //files to compress srcVec.push_back((TCHAR*)"d:\\src\\test\\jpg\\MRT.jpg"); srcVec.push_back((TCHAR*)"d:\\src\\test\\jpg\\netzplan.jpg"); _CrtCheckMemory(); for (UINT k = 0; k< srcVec.size(); k++) { delete srcVec[k]; srcVec[k] = 0; } srcVec.clear(); return 0; }Ich habe keine Idee mehr wie ich dem Problem auf die Schliche kommen könnte.

1. Wie jencas schrieb: Wieso gibst Du speicher mit delete frei, den Du niemals allokiert hast?
2. Was oll dies TCHAR* Cast'erei. Das muss doch zwangsläufig auch in die Hose gehen, wenn Deine DLL Unicode unterstützt.
3. Der Punkt 2. Gilt auch für den Code in dem Du Pfade übergibst und auch wahllos durch die Genegnd castest. Warum machst Du das? Wenn der Typ nicht stimmt musst Du umwandeln! Da nützt kein Cast!
-
nur zur Aufklärung:
Das Problem ergab sich aus den verschiedenen compile Einstellungen der DLL und meiner EXE.
Ich musste bei beiden einstellen, dass sie MFC in einer dynamischen DLL verwenden und bei Codegenerierung auf Multithreaded Debug DLL.In der DLL hatte ich es, aber in meiner EXE nicht.
Die TCHAR*s durch CStrings ersetzt und jetzt geht alles - so weit ich feststellen kann!Trotzdem danke für den Input!
lg
nac_
-
Deine Erklärung ist unsinnig.
Der gezeigte Code ist Buggy ohne Ende und führt immer zuzm Crash:srcVec.push_back((TCHAR*)"d:\\src\\test\\jpg\\MRT.jpg"); srcVec.push_back((TCHAR*)"d:\\src\\test\\jpg\\netzplan.jpg"); _CrtCheckMemory(); for (UINT k = 0; k< srcVec.size(); k++) { delete srcVec[k];
-
Die von dir gepasteten Zeilen gibt es nicht mehr in meinem Code. Wie bereits geschrieben verwende ich keine TCHAR*s mehr.
Mein Vektor hält jetzt normale CString Objekte und durch die Veränderung der Project Settings wurde mein Fehler behoben.
lg
nac_