2013-08-04 9 views
5
int* arr = new int[count]; 

delete arr; 

Warum funktioniert das? Ich habe es überprüft und es befreit tatsächlich die Erinnerung. Von dem, was ich gelesen habe, brauche ich delete[] arr; sonst wird es nicht wirklich den gesamten Speicher freigeben.C++ Array-Speicher ohne Klammern löschen funktioniert noch?

+1

AFAIK das ist UB. – Borgleader

+3

"Warum funktioniert das?" - Es scheint nicht, es scheint nur zu funktionieren. –

+0

Ohne die Klammern rufen Sie nur einen Destruktor auf, nicht alle Destruktoren im Array. Siehe auch http://StackOverflow.com/Questions/2425728/Delete-VS-Delete-Operators-in-C – GreatBigBore

Antwort

7

Jetzt versucht es mit dem Array mit Strings von 100 Bytes je Füllung, und sehen, ob es noch alle befreit die zugewiesenen Speicher ...

Es ist nicht definiertes Verhalten, und wie immer, manchmal UB erscheint arbeiten. In Ihrem Fall haben Sie keinen Destruktor für die Objekte im Speicher, so dass es keine "weitere Arbeit" gibt, sondern nur den gesamten Speicher [1]. Aber wenn Sie ein Objekt haben, das einen Destruktor hat, der etwas Nützliches tut, wird es (wahrscheinlich) nicht aufgerufen.

Sie sollten IMMER delete [] verwenden, wenn Sie new T[size]; verwenden, um zuzuweisen. Mischen Sie nicht die beiden, es ist immer falsch - nur manchmal passiert es zu arbeiten [genau wie einige Größen von Schlüsseln in Zoll funktioniert auf mm Muttern und umgekehrt - aber es ist immer noch falsch, einen Zoll Schraubenschlüssel auf metrischen Muttern verwenden].

[1] Beachten Sie, dass dies für diese bestimmte Compiler/C++ - Bibliothek Kombination funktionieren kann. Das Kompilieren mit einem anderen Compiler, das Verwenden einer anderen C++ - Bibliothek oder das Kompilieren für ein anderes Betriebssystem kann zum Absturz führen, wenn Sie dasselbe versuchen.

3

delete und delete [] sind eigentlich verschiedene Operatoren und die falsche zu verwenden ist immer ein Fehler. Das Problem ist, dass es zu der Zeit oft gut scheint, aber der Haufen wurde beschädigt und Sie werden sehr wahrscheinlich später einen scheinbar nicht zusammenhängenden Absturz erleben.

+0

Ich verstehe nicht, warum ich für diese markiert werden, da es wahr ist. Sie könnten versuchen, Valgrind oder ein ähnliches Speicheranalyse-Tool auszuführen, und es wird die Heap-Beschädigung angezeigt, wenn es passiert. –

+1

Ich hoffe Downvoters kommentieren. Ich bin interessiert, welcher Teil nicht korrekt ist. – user2029077

+0

Ich weiß nicht warum - das ist eine vollkommen genaue Antwort. – Puppy

6

Der Unterschied ist nicht, ob die zugewiesenen Speicher ordnungsgemäß freigegeben wird - egal ob Sie

delete 

oder

delete[] 

der Speicher noch richtig freigegeben werden verwenden.

Der Unterschied besteht darin, ob die Destruktoren ordnungsgemäß aufgerufen werden oder nicht.

Dies hat keinen praktischen Effekt für primitive Typen wie int oder float, aber wenn Sie ein Array einer Klasse haben, kann der Unterschied kritisch sein.

+0

Ich kann mir eine Implementierung vorstellen, wo das wahr wäre. Haben Sie eine tatsächliche Dokumentation einer Implementierung, die dies bestätigt? – sehe

+2

Keine Dokumentation, nur meine eigene Erfahrung in diesem ist mit Visual C++. Eine Weile her, aber ich erinnere mich an Bugs, weil ich falsch löschte statt löschen []. Ziemlich sicher, dass es sich so verhalten hat, wie ich es beschrieben habe ... beachte, dass * x den gleichen Ort wie x [0] dereferenziert und x als einen Zeiger deklariert, der nichts darüber sagt, ob das Zielobjekt Skalar oder Array ist, also der Löschoperator wird nicht wissen, dass es ein Array von Objekt gegen ein Skalarobjekt zerstören muss, es sei denn, Sie sagen es über ein geeignetes Löschkonstrukt. – Zenilogix

Verwandte Themen