delete [] problem



  • Joa. Da "Second" sechs Zeichen hat und keines dieser Zeichen ein Nullbyte ist hätte man da mit etwas nachdenken auch selbst drauf kommen können, selbst wenn man das Konzept der C-Strings nicht unbedingt kennt 😉



  • das passt doch irgendwie nicht ?
    der fehler muesste dann doch bei der zuweisung kommen und nicht beim delete - und

    "CRT detected that the application wrote to memory after end of heap buffer" sagt das er mehr loeschen will als reserviert wurde

    -----

    #idee-bekommen-hab

    kann es sein das das "delete []" n zeichen loeschen will bis ein \0 kommt und da es zu wenig war kommt keines ?



  • new TCHAR[NameLenght + 1];
    


  • stimmt, meine theorie stimmt, habs grad ausprobiert und nu gehts fehlerfrei

    std::wstring CLists::GetItemText(UINT Pos){
        int NameLenght = ((int)::SendMessage(m_Handle, LB_GETTEXTLEN, Pos, NULL)+1);
        TCHAR *Name = new TCHAR[NameLenght];
        SecureZeroMemory(Name, NameLenght);
        ::SendMessage(m_Handle, LB_GETTEXT, Pos, (LPARAM)Name);
        std::wstring os(Name);
        delete []Name;
        return os;
    }
    

    dankeschoen {haette ja mal in den speicher schauen koennen #gg}



  • Öhm, was genau war noch mal deine Theorie?

    Babelfish sagt zu der Fehlermeldung:

    Babelfish schrieb:

    CRT ermittelte, daß die Anwendung zum Gedächtnis nach Ende des Haufenpuffers schrieb.

    Es geht definitiv darum, dass du über die Grenzen des angeforderten Speichers schreibst. delete[] kümmert sich nicht um Nullbytes, die Anzahl der Elemente des Arrays werden irgendwo vor dem Anfang des Blocks gespeichert (und zwar unabhängig vom verwendeten Typ, dessen Arrays ja nicht nullterminiert sein müssen).



  • Meine Theorie ist dass Dein Heapmanager im Debug-Modus hinter dem angeforderten Bereich irgendeinen Marker setzt und diesen erst beim delete prüft. Natürlich ist das nur eine Theorie 😉

    BTW:
    Die Grenzüberschreitung hat undefiniertes Verhalten zur Folge. Das heisst nicht dass er zu genau dem Zeitpunkt abstürzen muss.



  • meine theorie ist das delete bis zum \0 loeschen will, da der speicher aber zu klein war und das \0 nicht mitgespeichert wurde will er weiterloeschen als er darf



  • Liest Du was hier geschrieben wird?



  • Mr Evil schrieb:

    meine theorie ist das delete bis zum \0 loeschen will

    Nein, delete ist es vollkommen egal, was im Speicher steht. Wohlgemerkt der Speicher der Nutzdaten. Also die Anzahl der Bytes, die new reservieren soll. Wie LordJaxom schon schrieb, wird der Fehler daher rühren, dass durch das Überschreiben von irgendwelchen Kontrolldaten ausserhalb der eigentlichen Nutzdaten der Speichermanager Amok läuft.



  • LordJaxom schrieb:

    Liest Du was hier geschrieben wird?

    konnte gestern nur ueberfliegen hatte kaum zeit - dank fuer die ausfuehrlichen erklaerungen {=


Anmelden zum Antworten