Frage wegen delete[] - funktion



  • also es ist nicht meine doktorarbeit, die ich auf diesem code aufbaue. der code selber war die doktorarbeit, die ist auch schon durch und abgegeben. ich muss nurnoch 1-2 zusätzliche funktionen einbauen im rahmen einer masterarbeit - das ganze programm sind geschätzt <100000 zeilen, also von neu aufziehen wird da eher schwierig. die einzige alternative zu dem makro, welches ich gefunden habe, ist:

    template<typename T> void safe_delete(T*& a) {
    delete a;
    a = NULL;
    }

    damit ging es jedenfalls auch nicht .. es ist einfach schwierig was zu ändern, weil ich keine ahnung habe was für auswirkungen meine änderungen in irgendwelchen von den X anderen klassen/funktionen haben können .


  • Mod

    Wie schon gesagt, gibt es da nicht viel zu retten. Tut mir Leid für die unbefriedigende Antwort, aber ist eben einfach so. Der Code ist unwartbar und ich bin ehrlich gesagt schwer überrascht, dass da überhaupt etwas Funktionierendes mit gemacht wurde. Mehr noch, wenn das Programm wirklich 100,000 Zeilen hat. (Ohne es zu kennen wette ich, dass davon 80,000 problemlos entfernt werden könnten.)

    Der Tipp kann nur sein, diese Funktionen nicht zu benutzen und möglichst drumherum zu programmieren. Du brauchst in C++ (fast) nirgendwo new und delete. Und nirgendwo new[] und delete[]! Nimm für deinen eigenen Code einfach vector (statt new[] und delete[]), automatische Objekte (für falsch gesetzt new und delete) oder unique_ptr (für zwar richtige, aber schlecht benutzte new und delete).
    Wenn der restliche Code nicht zu schlimm ist (und beispielsweise nicht anfängt new und delete oder gar malloc und free im Interface zu benutzen), dann bieten die obigen Mittel alles was man braucht, um auch das hässlichste Interface zu bedienen. Du benutzt dann nur die Funktionen, die wirklich etwas tun. Die ganze Speicherverwaltung machst du selber. Was mit den oben genannten Mittel übrigens auf ein entspanntes Nichtstun hinausläuft.



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



  • 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!


Anmelden zum Antworten