Müssen neue immer gefolgt von löschen?[Duplikat]
-
23-08-2019 - |
Frage
Ich denke, wir verstehen alle die Notwendigkeit, delete
beim Neuzuweisen einer dynamisch zugewiesenen Zeiger, um einen Speicherüberlauf zu verhindern.Aber ich bin neugierig, zu was Ausmaß hat die C++ - Mandat die Verwendung von delete
?Nehmen wir zum Beispiel das folgende Programm
int main()
{
int* arr = new int[5];
return 0;
}
Während für alle Absichten und Zwecke, kein Leck Auftritt, hier (da Ihr Programm zu Ende und das Betriebssystem sauber bis alle Erinnerung, sobald es den gibt), aber nicht der standard immer noch erforderlich-oder empfehlen -- die Verwendung von delete[]
in diesem Fall?Wenn nicht, gäbe es irgendeinen anderen Grund, warum Sie delete[]
hier?
Lösung
Es gibt nichts, das erfordert, dass delete[]
in der standard - Jedoch würde ich sagen, es ist eine sehr gute Leitlinie zu Folgen.
Es ist jedoch besser, die Praxis zu verwenden delete
oder delete[]
mit jedem new
oder new[]
Betrieb, auch wenn der Speicher aufgeräumt werden von der Beendigung des Programms.
Viele benutzerdefinierte Objekte haben einen Destruktor andere Logik als nur die Säuberung der Speicher.Verwendung delete
garantiert die Zerstörung in diesen Fällen.
Auch, wenn Sie sich jemals bewegen, Ihre Routinen, Sie sind weniger wahrscheinlich zu verursachen Speicherlecks in anderen stellen in Ihrem code.
Andere Tipps
Dupe Gibt es einen Grund zu nennen delete in C++, wenn ein Programm beendet wird sowieso?
Die Antwort ist, dass, weil von Destruktoren ausgeführt werden müssen, ist es manchmal notwendig, um das Objekt zu löschen, bevor Sie das Programm verlassen.Auch viele memory-leak-detection-tools beschweren, wenn Sie dies nicht tun, so zu machen es einfacher zu finden, echte Speicherlecks, die Sie sollten versuchen, und löschen Sie alle Ihre Objekte vor dem beenden.
Bitte beachten Sie:
Bei der Verwendung von "neuen" und wenn nicht, in C++?
Über Konstruktoren/Destruktoren und new/delete-Operatoren in C++ für benutzerdefinierte Objekte
delete und delete [] das gleiche in Visual C++?
Warum gibt es eine neue spezielle und löschen für arrays?
Wie zu verfolgen Speicherzuordnungen in C++ (vor allem neu/löschen)
Array von structs und new / delete
Was ist der Unterschied zwischen new/delete und malloc/free?
Hier nicht.Aber als das Programm, das immer größer wird und komplexere ich würde verwalten meinem Speicher, so, dass kann ich track down bugs schneller.Der standard sagt nichts, sondern immer in gute Gewohnheiten in den kleineren Fall führt zu besseren code zu langfristig.
Sie sind vollkommen frei, zu vergessen, zu löschen.
Tun Sie wie Speicher zu verschwenden?
Ich weiß nicht, der Standard, aber es ist eine ganz Programmierstil um diese Frage: Absturz-nur softxare Theoretisch Datenbanken oder Betriebssystem-kernels entwickelt werden sollten als solche, aber oft ist es nicht wirklich praktisch ist, Sie zu verwenden wie die, weil Sie auf neu starten, es ist etwas Aufräumen, die lang sein können.Außerdem abhängige Systeme (Programme, die innerhalb einer Betriebssystem-oder Datenbank-clients) möglicherweise nicht Absturz-nur.