Es ist kein Speicherleck; Es ist undefined Verhalten. Das ist viel schlimmer.
Der Aufruf von delete
an Speicher, der von new[]
zugewiesen wurde, kann dazu führen, dass der Heap beschädigt wird, was Ihre Anwendung zum Absturz bringen kann. Natürlich nicht sofort, denn das wäre zu nützlich. Es wird irgendwann später abstürzen, lange nachdem der Heap beschädigt wurde, um es fast unmöglich zu machen, aufzuspüren.
Verwenden Sie immer delete[]
mit new[]
. Eigentlich nie mit new[]
beginnen. Verwenden Sie eine std::vector
, es sei denn, Sie haben sehr spezielle und spezifische Bedürfnisse.
Ich möchte wissen, warum?
Warum ist das wichtig? Es ist falsch und führt zu einem defekten Programm. Es ist falsch, weil der C++ - Standard dies sagt.
Wenn Sie jedoch auf Grund bestehen ...
Beachten Sie, dass Sie eine beliebige Anzahl von Elementen mit new[]
zuordnen kann. Sie können dort eine beliebige Zählnummer (aka: positive ganze Zahl) eingeben. So können Sie new int[50]
oder new int[someIntegerVariable]
haben. Es ist alles gut.
Beachten Sie auch, dass delete[]
tut nicht eine Zählung nehmen. Nun ... wie ist das möglich? Wenn Sie 50 int
s zuweisen, muss natürlich delete
wissen, wie viele Sie zugewiesen haben, richtig? Aber du musst es nicht sagen; es weiß automatisch.
Wie? Weil new int[50]
mehr zuweist als nur ein Array von 50 int
s. Es weist auch genügend Speicherplatz zu, um die Größe der Zuweisung zu halten. Stellen Sie sich vor, Sie würden 51 int
s zuweisen, aber nur 50 von ihnen verwenden.
Dann kommt delete[]
kommt daher. Es ermittelt, wo die Zählung zu finden ist, die new[]
zugeordnet ist. Und es verwendet diese Zählung, um den Speicher freizugeben.
delete
tut nicht dies tun. Daher kann nicht korrekt den Speicher freigeben.
obwohl wahr, es ist nicht die Frage [ich * denke *] - er fragt nach, wie es umgesetzt wird [ich stimme zu, die Frage war nicht sehr klar, bevor ich es editierte ...] – amit
Zuerst, danke. Amit, ist richtig. Ich möchte wissen, "wie ist es umgesetzt?" –
@chinazhangjie: Ich denke, ich habe * in Kürze * erläutert, wie jeder implementiert ist. Sie möchten eine * aktuelle * Implementierung? – Nawaz