2011-01-25 16 views

Odpowiedz

7

Pamięć jest zwalniana dopiero po zniszczeniu najmniejszego podobiektu klasy pochodnej. Więc jeśli masz:

class Base { 
}; 

class Derived : public Base { 
public: 
    ~Derived(); 
}; 

następnie pierwszy Derived zostaje zniszczona, a następnie Base jest zniszczony i dopiero wtedy pamięć jest zwalniane.

+0

Czy coś takiego istnieje? Wywoływany jest konkretny destruktor, który może być wirtualny, jeśli klasa zadeklarowała go jako taki. Ten destruktor jest odpowiedzialny za zniszczenie wszystkich podobiektów, a następnie pamięć zostaje zwolniona. Wszystkie podobiekty bez klas podstawowych są równie najmniej pochodne, a żadna nie ma szczególnej odpowiedzialności ani znaczenia. – Potatoswatter

+0

@Potatoswatter: Uwaga Nie określiłem, kto dokładnie odpowiada za wywołanie funkcji dealokacji - właśnie dlatego, że wykonanie wszystkich szczegółów wymagałoby odpowiedzi na dwie strony. – sharptooth

+0

@Potatoswatter: Nie jestem pewien, czy podążam. Żaden destruktor nie jest odpowiedzialny za niszczenie podobiektów. Destruktor jest odpowiedzialny za uwolnienie zasobów przechowywanych w tym obiekcie, ale nie musi (ani nie powinien) wywoływać destruktora innych obiektów: 'class test {string a; ~ test() {}}; 'Destruktor' ~ test' jest doskonale zdefiniowany w tym przykładzie, nie ma zasobów zarządzanych bezpośrednio przez klasę i nic nie robi. System wywoła '~ string' na podobiekcie' a' po zakończeniu wykonywania '~ test', a nie' ~ test'. To samo dotyczy dziedziczenia, destruktor bazy zostanie automatycznie wywołany. –

2

Pamięć zostanie zwolniona po zakończeniu działania destruktora. W przeciwnym razie dostęp do zmiennych członków wewnątrz destruktora spowodowałby uszkodzenia.

2

operator delete jest wywoływana po destructor, ale gdy pamięć jest zwalniana jest do używanych podzielnika

0

Myślę, że pamięć jest zwalniana po funkcji destructor sama zakończeniu wykonywania. Wiem, że gdy zostanie wychwycony wyjątek, destruktor do obiektu nie jest wywoływany, dopóki sam obiekt nie wykracza poza zakres.

3

Dokonaj dekompozycji delete w to, co faktycznie robi i stosunkowo łatwo jest zobaczyć, kiedy pamięć zostanie usunięta. Więc stwierdzenie tak:

delete some_ptr; 

jest z grubsza odpowiednikiem tego pseudo-kod:

some_ptr->~some_ptr(); 
free(some_ptr); 

więc pamięć jest zwalniana po wywołaniu destruktora. Dokładnie to, co robi destruktor, nie jest określone przez operatora delete, ale raczej definicja klasy. Zwykle wykonuje lokalne czyszczenie i zapewnia wywoływanie destruktorów klasy podstawowej.

Ważne jest, aby zdać sobie sprawę z tego, że uwolnienie pamięci nie jest w rzeczywistości częścią destruktora. Jest to operator delete, który zwalnia pamięć.


pamiętać, że funkcja w pseudo-kodzie free jest rzeczywiście jedną z funkcji operator delete(), zarówno dla usuniętego klasy lub globalny. To faktycznie uwalnia pamięć.

+0

To nie jest 'free()', to jest 'operator delete()'. – sharptooth

+0

@Sharptooth, czy możesz wyjaśnić? Wspomniałem, że był to "pseudo-kod". –

+1

Nawet jeśli jest to pseudokod C++ używa 'operator delete()' - albo globalnego, albo specyficznego dla klasy - do deallocatingu pamięci po poleceniu "delete". – sharptooth

0

W C++ destrukcja polega na wykonaniu kodu przy użyciu danych dostępnych w obiekcie. Ten kod jest arbitralny.

Uwolnienie pamięci to obsługa niskiego poziomu, ukryta przez operatora delete, która nigdy nie powinna być wywoływana przed wywołaniami do destruktora.

to najlepiej przedstawione przez interfejs Allocator:

  • allocate i deallocate służą do manipulowania pamięć RAW
  • construct i destroy są używane do wywołania konstruktorów i destruktory z obiektów

Jest precyzyjne, że construct, destroy i deallocate powinny być wykonywane tylko o n pamięć poprzednio przydzielona przez ten alokator. Daje również pewność, że destroy nie zwolni pamięci i że konieczne będzie kolejne wywołanie deallocate.

Należy zauważyć, że jest to interfejs niskiego poziomu, który umożliwia niszczenie obiektu i ponowne wykorzystanie zwolnionej przestrzeni w celu utworzenia kolejnego na miejscu.

Powiązane problemy