Dies ist nur ein Test-Projekt zu verstehen, wie die Vererbung funktioniert. Cat ist eine Unterklasse von Mammal, die wiederum eine Unterklasse von Animal ist.C++ löschen Zeiger-Array - doppelt frei oder Korruption
int main()
{
Cat* cat1 = new Cat("nosy grey", 1.0d, 3);
Cat* cat2 = new Cat("purply green", 2.0d, 4);
Cat* cats[] = {cat1, cat2};
delete [] cats;
}
Also ich kann das nicht wirklich tun, denn dann bekomme ich das.
*** Error in `/home/max/git/info-2-ss/Blatt3/Aufgabe2/main.exe': double free or corruption (out): 0x00007fff55fd7b10 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x80a46)[0x7f3a07452a46]
/home/max/git/info-2-ss/Blatt3/Aufgabe2/main.exe[0x40178e]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7f3a073f3ea5]
/home/max/git/info-2-ss/Blatt3/Aufgabe2/main.exe[0x400d39]
I-Ausgang, wenn meine Konstruktoren und Destruktoren genannt werden, so dass, wenn meine Katzen geschaffen werde ich bekommen etwas wie folgt aus:
Called ctor of Animal with age: 3
Called ctor of Mammal with hairLength: 1
Called ctor of Cat with eyecolor: nosy grey
Wenn ich meinen Code ein wenig ändern, so heißt es:
delete [] *cats;
dann habe ich erwartet, dass meine dtors wie dies für jede Katze aufgerufen:
Called dtor of Cat
Called dtor of Mammal
Called dtor of Animal
stattdessen erhalte ich diese einzige Zeile:
Called dtor of Cat
Zusammenfassung: Wie kann ich meine Arrays effektiv löschen, so dass alle mein dtors gecallt?
Sie sollten wirklich zuerst über Zeiger und dynamische Zuordnung lesen. 'cats []' wird auf Stapel zugewiesen, Sie können es nicht "löschen". Stattdessen sollten Sie darüber iterieren und 'lösche' zu jedem Element verwenden. –
Verwenden Sie 'delete' nur, wenn Sie' new' verwendet haben. Sie haben Stapelzuordnung, lassen Sie es sich aufräumen. Erwägen Sie, etwas über 'std :: shared_ptr' und' std :: unique_ptr' zu erfahren - es ist einfacher zu lernen als die manuelle Speicherverwaltung. –