Frage wegen delete[] - funktion



  • beinando123 schrieb:

    die methode loadCalibrationData ruft freeCalibrationData auf, bevor die Variablen überhaupt angelegt werden. die variablen sollen in freeCalibrationData gelöscht werden. eigentlich müssten die variablen jedoch den wert NULL besitzen, da sie nur deklariert, jedoch noch nicht initialisiert wurden. also müsste das makro SAVE_DELETE beim ersten durchlauf einfach nichts tun.

    Das ist nicht so. Ganz im Gegenteil werden die Zeiger mit großer Sicherheit einen Wert != NULL haben.


  • Mod

    Bashar schrieb:

    Wurde der Code irgendwo hochgeladen oder woher weißt du, dass er unwartbar ist?

    100,000 Zeilen und alle Ausschnitte die wir sehen sind Musterbeispiele für wie man es nicht macht.



  • beinando123 schrieb:

    #define SAVE_DELETE(x)	if(x) { delete[] x; x = NULL; }
    

    wichtig: das makro wird auf dateien**[?]** vom typ float* angewandt, zum beispiel:

    Manchmal bin ich dankbar dafür, dass es Java gibt. Leute, die keine Zeit haben, richtig C++ zu lernen, sind bei Java besser aufgehoben.



  • +1



  • Vor einiger Zeit sprach ich mit einem Gamecoder. Nunja, eventuell hätte ich Lust gehabt, am Projekt mitzuwirken. Um mich zu testen, frage er mich, wie man safe-delete RICHTIG implementiert.
    Ich wußte es natürlich: Als Template (unter anderem mit Referenz auf Zeiger) und nicht als Makro. Aber irgendwie dachte ich mir, daß die Mitarbeit dort dann doch zu mühsam wäre.



  • SeppJ schrieb:

    Noch dazu SAFE_DELETE Makros.

    SAVE_DELETE. Ich weiß, wurde schon gesagt. Find ich trotzdem lustig 🙂


  • Mod

    Mechanics schrieb:

    SeppJ schrieb:

    Noch dazu SAFE_DELETE Makros.

    SAVE_DELETE. Ich weiß, wurde schon gesagt. Find ich trotzdem lustig 🙂

    Autsch. Jetzt fällt mir das erst auf. Dabei fragte ich mich die ganze Zeit, was Nexus auf der ersten Seite meinte. 💡

    Mit der Schreibweise fällt das schon fast unter Satire. Vielleicht legen sie den Neuen rein? Die Informatikerversion von Feilenfett und Getriebesand?



  • SeppJ schrieb:

    Getriebesand?

    Wirst lachen, es ist eine nicht unübliche Methode, Sand in Zauberwürfel zu schütten und sie dann 20- 30-mal zu lösen, bevor man den Sand wieder komplett wegmacht und den Würfel schmiert. Damit alle Herstellungsungenauigkeiten, die störende Hubbel waren, dann gewesen sind.

    Als es noch keine elektronischen Waagen gab, waren Balkenwaagen und Abarten wie Dezimalwaagen viel viel genauer als Federwaagen und deshalb üblich mitsamt Gewichten, weshalb "Hol mal die Gewichte für die Wasserwaage" klappte.
    Und wer kein Gefühl für "Schwung" hat, den läßt man auch mal eine "Kolbenrückholfeder" holen.



  • volkard schrieb:

    Vor einiger Zeit sprach ich mit einem Gamecoder. Nunja, eventuell hätte ich Lust gehabt, am Projekt mitzuwirken. Um mich zu testen, frage er mich, wie man safe-delete RICHTIG implementiert.
    Ich wußte es natürlich: Gar nicht, weil man es nie braucht.

    FTFY

    Oder, wo zum Teufel braucht das ein richtiger C++-Programmierer mit C++03? 🙂

    Btw: Ist es nicht schon immer so gewesen, dass delete ( [] ) Bei Null-Zeigern SOWIESO nichts macht?



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



  • beinando123 schrieb:

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

    Gar nichts. Du brauchst das nicht. Schreib delete[] und fertig - oder nimm gleich std::vector, wie hier schon gesagt wurde.



  • 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 😉 .


Anmelden zum Antworten