Fehler Destruktor



  • Weil du versuchst, etwas von Hand zu machen, das danach automatisch passiert. Lösche also die Zeile mit dem Destruktor.

    Der Aufruf wäre syntaktisch korrekt test2->~doubleArr(), aber wie schon versucht zu sagen, es wäre falsch, das so zu benutzen. Dann ist noch der Fehler mit dem Copy-Constructor drin, der aber ja schon angemerkt wurde.



  • @Th69
    Ja, natürlich hast Du Recht. In der Eile die falsche Formulierung genutzt.

    @C-Sepp sagte in Fehler Destruktor:

    Ich wollte trotzdem mit delete den Speicherplatz mal explizit schon vorher löschen und dann mit diversen
    Zugriffsmethoden schauen, was dann im Speicher drinnen steht.

    Nein, der Sinn einen eigenen korrekt geschriebenen Klasse ist es ja gerade, dass man die Resourcen eben nicht von Hand freigibt!
    Dieser Link hier ist sinnvoll durchzulesen https://en.cppreference.com/w/cpp/language/rule_of_three



  • @C-Sepp sagte in Fehler Destruktor:

    Erst die Tilde, dann der Objektname und schließlich die Klammern?

    Nicht der Objektname, der Klassenname.
    Einen Destruktor ruft man auf wie jede andere Memberfunktion. Wenn du nur mal aus Interesse schauen willst was nach der Ausführung des Destruktors in dem Speicherbereich des ehemaligen Objekts steht, das kannst du einfach so machen:

    T* t = new T();
    t->~T(); // Destruktor aufrufen ohne Speicher freizugeben
    // <hier im Debugger anhalten um nachzusehen>
    operator delete(t); // Speicher freigeben ohne Destruktor aufzurufen
    

    Ich fürchte bloss dass dich das Ergebnis nur noch mehr verwirren wird.



  • Was ist daran so verwirrend. Zum Zugriff auf die Datenelemente der Klasse habe ich mir entsprechende Zugriffmethoden
    definiert und mit geschaut, was die so liefern. getlen, getptr und den Indexoperator:

    ...
    int getlen(void) const
    {
    	return len;
    }
    
    int* getptr(void) const
    {
    	return ptrArr;
    }
    
    int operator[](int index) const
    {
    	return ptrArr[index];
    }
    

    Wie erwartet wurden mit test2.~doubleArr() bzw. ptrdoubleArr ->~doubleArr() die Wert des dynmaisch adressierten
    Speicherbereichs gelöscht. Vielen Dank!



  • @C-Sepp sagte in Fehler Destruktor:

    Was ist daran so verwirrend.

    ...

    Wie erwartet wurden mit test2.~doubleArr() bzw. ptrdoubleArr ->~doubleArr() die Wert des dynmaisch adressierten
    Speicherbereichs gelöscht. Vielen Dank!

    Naja genau das. Weil das halt so nicht stimmt. Probier das ganze mal mit nem etwas grösseren Array, zig~hunderte Einträge. Und dann guck dir alle Einträge an. Was da nachher drinsteht ist schlicht undefiniert, und i.A. wird bei grösseren Arrays genug von den Werten übrig bleiben. Du kannst nicht davon ausgehen dass da was "gelöscht" oder überschrieben wird.



  • @C-Sepp sagte in Fehler Destruktor:

    Wie erwartet wurden mit test2.~doubleArr() bzw. ptrdoubleArr ->~doubleArr() die Wert des dynmaisch adressierten
    Speicherbereichs gelöscht. Vielen Dank!

    NEIN! DAS SOLLST DU SO NICHT AUFRUFEN!!

    Laut und verständlich genug?



  • @C-Sepp sagte in Fehler Destruktor:

    Was ist daran so verwirrend. Zum Zugriff auf die Datenelemente der Klasse habe ich mir entsprechende Zugriffmethoden
    definiert und mit geschaut, was die so liefern. getlen, getptr und den Indexoperator:

    int operator[](int index) const
    {
    	return ptrArr[index];
    }
    

    So sollte man den Indexoperator auch nicht definieren.

    T& operator[] (const size_t i);
    

    So kann man Elemente auf auch korrekt zugreifen und verändern.



  • Laut und verständlich genug....new und delete sollte man besser erst gar nicht benutzen.



  • Das außerdem (da es Smartpointer, std::vector, etc. gibt), aber hier ging es darum, daß du den Destruktor nicht selbst im Code aufrufen sollst!



  • @C-Sepp sagte in Fehler Destruktor:

    Laut und verständlich genug....new und delete sollte man besser erst gar nicht benutzen.

    Jein, es gibt wenig Gründe dafür. Aber wenn man es tut, dann sollte man es auch richtig machen. Wenn Du das für Übungszwecke umsetzen willst, kannst Du das hier einmal durch exerzieren. Dann siehst Du auch, weshalb man das normalerweise nicht tun sollte.

    Placement new und delete nutzt man nur wenn man selbst Container entwirft. Das ist sicherlich interessant, aber für Anfänger zuerst unwichtig. Denn Container Design ist nochmals eine ganze Ecke schwerer.


Anmelden zum Antworten