2009-04-04 12 views
8

Ich denke, wir alle verstehen die Notwendigkeit des Löschens beim Neuzuweisen eines dynamisch zugewiesenen Zeigers, um Speicherlecks zu verhindern. Ich bin allerdings gespannt, inwiefern C++ die Verwendung von delete vorschreibt. Nehmen wir zum Beispiel das folgende ProgrammMuss neu immer gelöscht werden?

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

Während für alle Absichten und Zwecke kein Leck hier auftritt (da Ihr Programm endet und das Betriebssystem wird den gesamten Speicher aufzuräumen, sobald er zurückkehrt), aber tut die Standard erfordern nach wie vor - - oder empfehlen - die Verwendung von delete [] in diesem Fall? Wenn nicht, würde es einen anderen Grund geben, warum Sie [] hier löschen würden?

Antwort

10

Es gibt nichts, was ein delete [] in der Norm erfordert - aber ich würde sagen, es ist eine sehr gute Richtlinie zu folgen.

Es ist jedoch besser, ein Löschen oder Löschen [] bei jeder neuen oder neuen [] -Operation zu verwenden, auch wenn der Speicher durch das Beenden des Programms bereinigt wird.

Viele benutzerdefinierte Objekte verfügen über einen Destruktor, der andere Logik als nur das Bereinigen des Speichers ausführt. Die Verwendung von delete garantiert die Zerstörung in diesen Fällen.

Wenn Sie sich in Ihren Routinen bewegen, ist es weniger wahrscheinlich, dass Sie Speicherlecks an anderen Stellen in Ihrem Code verursachen.

0

Sie können vollkommen vergessen, Dinge zu löschen.

Mögen Sie Speicherverschwendung?

1

Hier keine. Aber wenn das Programm größer und komplexer wird, würde ich meinen Speicher verwalten, damit ich Bugs schneller aufspüren kann. Der Standard sagt nichts, aber in kleinen Fällen gute Gewohnheiten zu bekommen, führt zu einem besseren langfristigen Code.

+0

In der Tat, ich finde, dass ich oft delete [] Aussagen direkt vor der Rückkehr tippe, obwohl ich (auf praktischer Ebene) wusste, dass es keinen Unterschied machte. Und das ist keine Gewohnheit, die ich auch stoppen möchte - ich war nur daran interessiert, inwieweit der Standard es empfahl. – GRB

0

Ich weiß nicht den Standard, aber es gibt einen ganzen Programmierstil um diese Frage: crash-only softxare Theoretisch Datenbanken oder OS-Kernel sollte als solche entwickelt werden, aber es ist oft nicht wirklich praktisch, sie so, weil bei einem Neustart zu verwenden Es gibt einige Aufräumarbeiten, die lange dauern können. Außerdem sind abhängige Systeme (Programme innerhalb eines Betriebssystems oder Datenbank-Clients) möglicherweise nicht nur absturzsicher.

7

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

Antwort ist, dass Destruktoren wegen, die ausgeführt werden müssen, ist es manchmal notwendig ist, um das Objekt vor dem Austritt aus dem Programm zu löschen. Wenn Sie dies nicht tun, werden sich viele Speicherlecksuche-Tools ebenfalls beschweren. Um das Auffinden von echten Speicherlecks zu erleichtern, sollten Sie daher versuchen, alle Objekte vor dem Beenden zu löschen.

+0

Ich habe das verpasst! :) –

+0

Ja, es war eigentlich ziemlich schwer zu finden; Sie haben mich auf den Posten geschlagen, seit ich mir die Zeit genommen habe, diesen einen Artikel zu finden, wie ich ihn in den letzten Tagen gefragt hatte. –

Verwandte Themen