To tylko projekt testowy, który pozwala zrozumieć, jak działa dziedziczenie. Cat jest podklasą Mammal, która ponownie jest podklasą Animal.C++ Usuń tablicę wskaźników - podwójnie za darmo lub z korupcją
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;
}
Tak naprawdę nie mogę tego zrobić, ponieważ wtedy dostaję to.
*** 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]
wyjście I kiedy moje konstruktory i destruktory są nazywane, więc gdy moje koty się stworzony mam coś takiego:
Called ctor of Animal with age: 3
Called ctor of Mammal with hairLength: 1
Called ctor of Cat with eyecolor: nosy grey
Kiedy zmiana kodu nieco więc brzmi:
delete [] *cats;
potem będzie już oczekiwać, że moi dtors nazywa się tak za każdym cat:
Called dtor of Cat
Called dtor of Mammal
Called dtor of Animal
zamiast otrzymuję ten pojedynczy wiersz:
Called dtor of Cat
Podsumowanie: Jak można skutecznie usunąć moje tablice, tak, że wszyscy moi dtors się nazywa?
Najpierw powinieneś przeczytać o wskaźnikach i alokacji dynamicznej. 'cats []' jest przydzielany na stosie, nie można go "usunąć". Zamiast tego powinieneś iterować i użyć 'delete' do każdego elementu. –
Nie używaj 'delete', chyba że użyłeś' new'. Masz przydzielenie sterty, pozwól mu się oczyścić. Rozważ uczenie się o 'std :: shared_ptr' i' std :: unique_ptr' - łatwiej będzie się nauczyć niż ręcznego zarządzania pamięcią. –