Frage wegen delete[] - funktion



  • beinando123 schrieb:

    was ist denn die alternative zu dem makro? soll ichs mit einer inline- funktion versuchen ?

    Alternative? Du wirst rausfinden müssen, wo das Makro mit ungültigen Zeigern gefüttert wird - siehe auch meinen vorherigen post.



  • ich versehe garnicht, warum der befehl delete[] lautet, es werden nur float* variablen reingeworfen, an keiner stelle arrays. aber danke schonmal.



  • beinando123 schrieb:

    ich versehe garnicht, warum der befehl delete[] lautet, es werden nur float* variablen reingeworfen, an keiner stelle arrays. aber danke schonmal.

    Weriden die floats mit new float[] oder mit new float allokiert? zu new float[] gehört delete[] und zu new gehört delete.



  • beinando123 schrieb:

    ich versehe garnicht, warum der befehl delete[] lautet, es werden nur float* variablen reingeworfen, an keiner stelle arrays.

    Du glaubst anscheinend, delete wäre für Zeiger und delete[] für Arrays. Das ist nicht der Fall. Beide sind für Zeiger. delete ist für Zeiger auf Speicher, der mit new geholt wurde. delete[] ist für Zeiger auf Speicher, der mit new[] geholt wurde.



  • ah doch sie sind als array angelegt, mein fehler.



  • okay ich habe den bug behoben, danke nochmal!



  • Die beste Rettung für SAV FE_DELETE

    #define SAFE_DELETE(x) delete[] x
    

    Dann ist wenigstens das dumme Pointer nullen Geschichte und du kannst mit Debugwerkzeugen & Programmabstürzen Programmierfehlen auf die Spur kommen.



  • Wie waere es mit:

    #define SAFE_DELETE(x) { delete[] x; reinterpret_cast<int&>(x) = 0xC0FFEE; }
    

  • Mod

    Kellerautomat schrieb:

    Wie waere es mit:

    #define SAFE_DELETE(x) { delete[] x; reinterpret_cast<int&>(x) = 0xC0FFEE; }
    

    0xC0FFEE ist Java 😉 .


  • Mod

    Kellerautomat schrieb:

    Wie waere es mit:

    #define SAFE_DELETE(x) { delete[] x; reinterpret_cast<int&>(x) = 0xC0FFEE; }
    

    Der Cast steht auf der falschen Seite der Zuweisung.
    Mit

    reinterpret_cast<const void*&>(x) = reinterpret_cast<void*>(0xC0FFEE);
    

    kommst du evtl. davon.



  • Kellerautomat schrieb:

    Wie waere es mit:

    #define SAFE_DELETE(x) { delete[] x; reinterpret_cast<int&>(x) = 0xC0FFEE; }
    

    Warum nicht als Inline-Funktion? Wo ist die Unterscheidung zwischen Array-Löschen und Einzelobjekt-Löschen? So verführt es dazu, daß man aus falsch verstandenem Sicherheitsglauben immer SAFE_DELETE aufruft und ein vormals korrekted delete jetzt zum delete[] macht. x zu klammen, wäre eine feine Idee.

    Natürlich geht wird trotzdem die Funktion geändert, zum Beispiel geht nicht mehr

    pWindow->Close();
    SAFE_DELETE_SINGLE_OBJECT(pWindow);
    unregister(pWindow);
    

    Aber macht ja nichts, wir sind ja pfiffig.

    Window* deadWindow=pWindow;
    pWindow->Close();
    SAFE_DELETE_SINGLE_OBJECT(pWindow);
    unregister(deadWindow);
    


  • Man möchte ja nur sein SAFE_DELETE unschädlicher machen ... mit minimalem Arbeitsaufwand. 😉

    Aber stimmt:

    template<typename T>
    void SAFE_DELETE(T*& ptr)
    {
        delete[] ptr;
        ptr = (T*)-1;
    }
    

    Perfekt um Abstürze zu erzwingen.


Anmelden zum Antworten