2009-04-04 10 views
8

Myślę, że wszyscy rozumiemy konieczność usunięcia podczas przydzielania dynamicznie przydzielanego wskaźnika w celu uniknięcia wycieków pamięci. Jednak jestem ciekawy, w jakim stopniu C++ wymaga użycia delete? Na przykład, weźmy następujący programCzy nowe zawsze musi następować usunięcie?

int main() 
{ 
    int* arr = new int[5]; 
    return 0; 
} 

Chociaż dla wszystkich zamiarów i celów występuje tu żaden przeciek (ponieważ program kończy się, a system operacyjny będzie oczyścić całą pamięć raz powraca), ale robi średnia nadal wymagać - - lub polecam - użycie delete [] w tym przypadku? Jeśli nie, czy istnieje jakiś inny powód, dlaczego chcesz usunąć [] tutaj?

Odpowiedz

10

Nie ma nic, co wymaga delete [] w normie - Jednak chciałbym powiedzieć, że jest to bardzo dobra wskazówka do naśladowania.

Jednak lepiej jest użyć polecenia delete lub delete [] przy każdej nowej lub nowej operacji [], nawet jeśli pamięć zostanie wyczyszczona po zakończeniu programu.

Wiele niestandardowych obiektów będzie miało destruktor, który wykonuje inną logikę, niż tylko czyszczenie pamięci. Użycie delete gwarantuje zniszczenie w tych przypadkach.

Ponadto, jeśli kiedykolwiek poruszasz się po swoich procedurach, istnieje mniejsze prawdopodobieństwo, że spowoduje to wycieki pamięci w innych miejscach kodu.

0

Możesz całkowicie zapomnieć o usuwaniu rzeczy.

Lubisz tracić pamięć?

1

Tutaj nie. Ale gdy program staje się większy i bardziej złożony, zarządzałbym swoją pamięcią, aby szybciej śledzić błędy. Standard mówi tylko o tym, że wchodzenie w dobre nawyki w mniejszym przypadku prowadzi do lepszego kodu w dłuższej perspektywie.

+0

Rzeczywiście, mam na myśli, że często przepisuję wyciągi [] tuż przed powrotem, mimo że wiedziałem (na poziomie praktycznym), że nie ma to znaczenia. I nie jest to przyzwyczajenie, które zamierzam zatrzymać - interesowało mnie tylko to, w jakim stopniu zalecił to standard. – GRB

0

Nie znam standardu, ale istnieje cały styl programowania wokół tego pytania: crash-only softxare Teoretycznie bazy danych lub jądra systemu operacyjnego powinny być opracowywane jako takie, ale często nie jest tak praktyczne, aby używać ich w ten sposób, ponieważ po ponownym uruchomieniu komputera jest kilka porządków, które mogą być długie. Ponadto systemy zależne (programy w systemie operacyjnym lub klientach baz danych) mogą nie być awaryjne.

7

Dupe od Is there a reason to call delete in C++ when a program is exiting anyway?

Odpowiedź jest taka, że ​​z powodu destruktorów, które należy uruchomić, czasem jest to konieczne, aby usunąć obiekt przed wyjściem z programu. Ponadto, wiele narzędzi do wykrywania wycieków pamięci będzie narzekać, jeśli tego nie zrobisz, więc aby ułatwić znalezienie prawdziwych wycieków pamięci, powinieneś spróbować i usunąć wszystkie obiekty przed wyjściem.

+0

Tęskniłem za tym! :) –

+0

Tak, to było naprawdę trudne do znalezienia; pobiliście mnie na pocztę, odkąd poświęciłem czas, aby znaleźć ten artykuł, o czym wiedziałem, że został poproszony w ciągu ostatnich kilku dni. –

Powiązane problemy