Alokacja robi dwie rzeczy:
1) Przydziela pamięć dla obiektu
2) wywołuje konstruktor w przydzielonej pamięci
Usunięcie robi dwie rzeczy:
1) wywołuje destruktor na obiekcie
2) Zwolnienie pamięci używanej przez zniszczony obiekt Po przydzieleniu na stos (A a;
), mówisz kompilatorowi "proszę zrobić dla mnie obiekt, poprzez przydzielenie pamięci, a następnie wywołanie t on konstruktor w tej pamięci. A skoro już przy tym jesteś, czy możesz obsłużyć wywoływanie destruktora i zwalnianie pamięci, kiedy wykracza ona poza zakres? Dzięki! "Gdy funkcja (główna) się kończy, obiekt wychodzi poza zasięg, wywoływany jest destruktor, a pamięć zostaje zwolniona. "proszę, uczyń dla mnie przedmiot. Wiem, co robię, więc nie zawracaj sobie głowy wywoływaniem destruktora lub zwalnianiem pamięci. Powiem ci, kiedy to zrobić, innym razem. "Gdy funkcja (główna) się kończy, przydzielony obiekt pozostaje w zakresie i nie jest niszczony ani zwalniany. Mam nadzieję, że masz wskaźnik do niego przechowywany gdzieś indziej w twoim program (jak w, skopiowałeś pa do jakiejś innej zmiennej o większym zasięgu).) Będziesz musiał powiedzieć kompilatorowi, aby zniszczył obiekt i zwolnił pamięć w pewnym momencie w przyszłości, w przeciwnym razie dostaniesz wycieku pamięci.
Po prostu, polecenie "usuń" dotyczy tylko obiektów przydzielonych do sterty, ponieważ jest to ręczny interfejs zarządzania pamięcią w C++ - nowy/usuń.Jest to polecenie dla alokatora sterty, a alokator sterty nie robi " t cokolwiek wiedzieć o obiektach przydzielonych do stosu Jeśli spróbujesz wywołać delete na obiekcie przydzielonym do stosu, możesz równie dobrze wywołać go na losowym adresie pamięci - są to te same rzeczy, o ile alokator sterty jest ustawiony cerned. Bardzo dużo jak próbuje uzyskać dostęp do obiektu poza granice tablicy:
int a[10];
std::cout << a[37] << "\n"; // a[37] points at... ? no one knows!
To po prostu nie ma na to zrobić :)
Edit: PS: Wycieki pamięci są ważniejsze, gdy przydzielasz pamięć w funkcji innej niż main
. Kiedy program się kończy, przeciekła pamięć zostaje zwolniona, więc wyciek pamięci w magistrali może nie być wielkim problemem, w zależności od twojego scenariusza. Jednak destruktory nigdy nie są wywoływane na wyciekach obiektów. Jeśli destruktor zrobi coś ważnego, na przykład zamknięcie bazy danych lub pliku, może pojawić się poważniejszy błąd na twoich rękach.
Proszę zmienić 'void main (void)' na 'int main()'. – avakar
Tak. Zwykle nie chcesz pisać funkcji (void) {}. Jest to zła składnia wielu autorytetów: http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.4 –