Probleme mit free()
-
Hi Leute ich hab folgendes Problem:
wenn ich free auf eine LPWSTR variable verwende bekomm ich folgenden fehler:Windows hat einen Haltepunkt in Programm.exe ausgelöst. Dies kann auf eine Beschädigung des Heaps zurückzuführen sein, die auf ein Problem in Programm.exe oder in einer der geladenen DLLs hinweist.
wenn ich weiter klick kommt dieser:
Debug Assertion Failed! Program:..\Programm.exe File:..\dbgheap.c Line:1322 Expression:_CrtIsValidHeapPointer(pUserData)
Der Code dazu ist:
int len=strlen(zs)* sizeof(zs); LPWSTR unicodestr = (LPWSTR)malloc(len); MultiByteToWideChar(CP_ACP, 0, zs, len, unicodestr, len); free(unicodestr);
der fehler trit bei free auf.
könnte mir jemand weiter helfen?
ich versteh nicht was da falsch leuft.
MFG
jojox
-
Lass mal den MultiByteToWideChar-Aufruf weg und sag Bescheid, ob du immer noch eine Fehlermeldung kriegst.
-
jojox_one schrieb:
Hi Leute ich hab folgendes Problem:
wenn ich free auf eine LPWSTR variable verwende bekomm ich folgenden fehler:Windows hat einen Haltepunkt in Programm.exe ausgelöst. Dies kann auf eine Beschädigung des Heaps zurückzuführen sein, die auf ein Problem in Programm.exe oder in einer der geladenen DLLs hinweist.
wenn ich weiter klick kommt dieser:
Debug Assertion Failed! Program:..\Programm.exe File:..\dbgheap.c Line:1322 Expression:_CrtIsValidHeapPointer(pUserData)
Der Code dazu ist:
int len=strlen(zs)* sizeof(zs); LPWSTR unicodestr = (LPWSTR)malloc(len); MultiByteToWideChar(CP_ACP, 0, zs, len, unicodestr, len); free(unicodestr);
der fehler trit bei free auf.
könnte mir jemand weiter helfen?
ich versteh nicht was da falsch leuft.
MFG
jojoxWas das in der MFC-Ecke zu suchen hat, weiß ich nicht, aber was dein Problem angeht, so würde ich zunächst das Ergebnis der Funktion
strlen
mit 1 addieren.free
merkt nur, dass da was zwischen der Reservierung des Speichers und der Freigebung fürchterlich schiefläuft.Wenn es dann noch zu einem Fehler kommt, hast du offensichtlich zu wenig Speicher für
unicodestr
reserviert. Das ist aber auch kein Wunder, schließlich reservierst du für einen WideChar genau die Größe von Speicher, die dein MultiByte-Zeiger belegt - und das ist zu wenig. Mach es doch so:int MultiByteLen=strlen(zs)*sizeof(zs); int WideCharLen=strlen(zs)*sizeof(LPWSTR); LPWSTR unicodestr=(LPWSTR)malloc(WideCharLen+sizeof(LPWSTR)); MultiByteToWideChar(CP_ACP,0,zs,MultiByteLen,unicodestr,WideCharLen); free(unicodestr);
Könnte funktionieren ... allerdings waren Strings immer meine Schwachstelle.
-
1.Tut mir leid wenns im falschen bereich gepostet ist.
2.ja wenn ich den aufruf von MultiByteToWideChar weg lasse funktionierts.
3.Der vorschlag von aus dem Westen funktioniert nicht.bin mir nochmal die funktion angucken.
achja und
strlen(zs)*sizeof(zs)==strlen(zs)*sizeof(LPWSTR)
-
Du musst zuerst MultiByteToWideChar mit NULL als Bufferadresse aufrufen, dann gibt er Dir die benötigte Bufferlänge zurück.
Wenn Dein String zs Nullterminiert ist, kannst Du für die Länge -1 eingeben.
Versuchs mal so:
int len = MultiByteToWideChar (CP_ACP, 0, zs, -1, NULL, 0); WCHAR* buf = new WCHAR [len + 1]; MultiByteToWideChar (CP_ACP, 0, zs, -1, buf, len); delete[] buf;
Herzliche Grüsse
Walter
-
vielen dank hat funktioniert