Ein weiterer sehr wichtiger Unterschied ist die Ausnahmesicherheit. In Ihrem Code:
int iCount = 5;
int i = 0;
while(i < iCount)
{
f = new foo();
i++;
}
Sie müssen sehr, sehr vorsichtig sein, keine Speicherlecks mit diesem zu erzeugen; Sie müssen sich unbedingt an alle foo
erinnern, um diese im Falle einer Ausnahme ordnungsgemäß zu reinigen. Wenn sich dieser Code in einem Konstruktor befindet, reicht es nicht aus, die Zuordnung in Ihrem Destruktor aufzuheben, denn wenn eine Ausnahme ausgelöst wird, wird Ihr Objekt niemals zum Leben erweckt und der Destruktor wird nicht aufgerufen. Diese weitere pflanzt richtige Kopie-Konstruktion und Kopie-Zuordnung zu schreiben, jede Ausnahme Safe, etc.
Moral: Verwenden Standardcontainer, wie vector
, list
oder deque
(es gibt mehr).
//////////////////
foo* f = new foo[iCount];
mindestens Dies wird jeder foo
konstruiert zerstören, wenn eine Ausnahme zwischen Zuteilung der ersten und letzten foo
geworfen wird.
Natürlich müssen Sie darauf achten, dass f
ordnungsgemäß gelöscht wird, vor allem, wenn es andere Wurfpunkte gibt, der Code, der diese Zuweisungen durchführt.
Moral: Verwenden Sie Standardbehälter. Die manuelle Speicherverwaltung mag auf den ersten Blick trivial erscheinen, besonders wenn Sie von C kommen, aber es ist nicht-trivial und kritisch, ausnahmesicheren Code zu schreiben.
Ich hörte, dass jedes Objekt, das wir von 16 Admin-Bytes umgeben umgeben. Die Blockzuweisung verwendet also nur einen Header-Guard. ist es wahr?. – nsa
Ich habe dieses Gerücht nicht gehört. Auf der anderen Seite wird 'new []' wahrscheinlich 'iCount' irgendwo speichern müssen, damit 'delete []' es finden kann.Vielleicht braucht das mehr Speicher und nicht weniger? –