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
    jojox

    Was 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 😉


Anmelden zum Antworten