Jeśli usunę obiekt, który wywoła jego destruktor, czy pamięć zostanie zwolniona przed lub po tym, jak destruktor zakończy działanie w funkcji?C++ destructor: kiedy pamięć zostanie zwolniona?
Odpowiedz
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.
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.
operator delete jest wywoływana po destructor, ale gdy pamięć jest zwalniana jest do używanych podzielnika
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.
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ęć.
To nie jest 'free()', to jest 'operator delete()'. – sharptooth
@Sharptooth, czy możesz wyjaśnić? Wspomniałem, że był to "pseudo-kod". –
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
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
ideallocate
służą do manipulowania pamięć RAWconstruct
idestroy
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.
- 1. Jak określić, kiedy pamięć obiektu Java zostanie zwolniona?
- 2. Kiedy kontroler widoku zostanie zwolniony, czy powinien opróżnić pamięć?
- 3. Czy pamięć użyta przez MKMapView może zostać zwolniona?
- 4. Czy pamięć std :: vector została zwolniona po wyczyszczeniu?
- 5. C++ 11 Destructor = delete
- 6. Destructor nie nazywa kiedy jest wyjątek
- 7. Czy wyciekająca pamięć została zwolniona po zakończeniu programu?
- 8. Python matplotlib: pamięć nie jest zwolniona przy określaniu rozmiaru rysunku
- 9. View.onDraw() --- kiedy zostanie wywołany?
- 10. Objective-C destructor z ARC
- 11. Jak wyczyścić pliki .NET, gdy biblioteka DLL C++/CLI zostanie zwolniona?
- 12. destructor statyczny
- 13. Kiedy strona PhoneApplicationPage zostanie usunięta?
- 14. Kiedy zostanie wydany Scala 2.8.0?
- 15. zmienne klasy obiekt-c: kiedy wywoływana jest dealloc?
- 16. Dowiedz się, gdzie pamięć sterty zostanie uszkodzona.
- 17. Weird enum w destructor
- 18. "Powierzchnia została zwolniona" błąd
- 19. Google Mock Destructor
- 20. Używana pamięć nigdy nie została zwolniona w węźle js. Bardzo dziwne
- 21. sfinae away a destructor
- 22. dylib destructor nie nazywa się
- 23. Kiedy zostanie usunięte $ _FILES ['file'] ['tmp_name']?
- 24. Kiedy VS 2010 RC zostanie wydany?
- 25. Kiedy metoda dispused nie zostanie wywołana?
- 26. Kiedy pamięć wycieku leksykonu Emacsa Lispa?
- 27. Dlaczego wywoływany jest python destructor?
- 28. Destructor statycznego obiektu skonstruowany w destructor innego statycznego obiektu
- 29. C++: pamięć wartości rvalue
- 30. C++ wyrównanie pamięć pytanie
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
@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
@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. –