new[] delete wann error?
-
Bei delete pA wird zwar der Speicher für das ganze Feld aufgegeben, jedoch nur für das erste Objekt der Destruktor aufgerufen. Das bedeutet, dass der Speicher verloren geht (memory leak), den das zweite bis letzte Objekt im Konstruktor angelegt haben. delete[] ruft den Destruktor für jedes Arrayelement auf. Dieser gibt den für das Objekt belegten Speicher wieder frei.
Es ging um:
Bei einfachen Typen funktioniert die Freigabe auch mit delete anstelle delete[]. Wird nirgends sauber beschrieben, immer nur davor gewarnt
Und ich glaube deine Erklärung könnte man unter:
Wird nirgends sauber beschrieben, immer nur davor gewarnt
einorden.
Der einzige Grund wieso man delete[] statt delete (oder delete statt delete[]!) nehmen soll ist weil der Standard zuläst, dass operator delete und operator delete[] verschieden implementiert sein können. Sie sind es aber (meines Wissen nach) nie. Das einzige was der Standard garantiert ist, dass
delete new int; delete[] new int[5];
funzen muss.
Also ist
delete new [4];
gleich schlimm wie:
void main(void)
Es ist nicht Standard aber jeder existierender Compiler kommt damit klar.
-
Hi!
Irgendwer schrieb:
Also ist
delete new [4];
gleich schlimm wie:
void main(void)
Es ist nicht Standard aber jeder existierender Compiler kommt damit klar
Kommt nicht, wie z.B. der VC++, der akzeptiert das nicht (void main()).
Code-Hacker
-
@irgendwer: warum liefert dann delete und delete[] im Bsp.von E.Henkes verschiedene Reaktionen, wenn diese gleich sind? Dein allgemeines Gerede kapier ich nicht.
-
es ist einfach undefiniertes verhalten- basta.
ärger bekommt man irgendwie schon noch
-
@irgendwer: warum liefert dann delete und delete[] im Bsp.von E.Henkes verschiedene Reaktionen, wenn diese gleich sind?
War die Frage jetzt ernst gemeint?
Weil A in seinem Beispiel einen Dtor hat und es geht um dtorlose Type.
-
Kein Wunder, dass viele C++ den Rücken kehren, bei solchen Fallstricken und undefinierten Möglichkeiten.
-
lool so kann mans natürlich auch sehen
aber in nem großen code weis man bei einem delete[] sofort, dass damit ein array gemeint ist, und mit einem delete sieht man sofort dass ein einzelnes objekt gemeint ist, sowas fördert die übersichtlichkeit-selbst wenn dem compiler egal sit, welches delete man benutzt
-
otze schrieb:
aber in nem großen code weis man bei einem delete[] sofort, dass damit ein array gemeint ist, und mit einem delete sieht man sofort dass ein einzelnes objekt gemeint ist, sowas fördert die übersichtlichkeit-selbst wenn dem compiler egal sit, welches delete man benutzt
ich halte das aber für irrelevant ob ich ein Array oder ein normales Objekt zerstöre.
Der Grund warum C++ da trennt ist einfach die Performance
-
wat passiert eigentlich, wenn ich immer delete[] verwende?
wäre das sicher?
-
hyperschlau schrieb:
wat passiert eigentlich, wenn ich immer delete[] verwende?
wäre das sicher?Nein. Es sei denn du wuerdest auch immer new[] verwenden.
Aber das ganze ist doch irrelevant - da man sowieso kein falsches delete verwendet. Warum? Weil man Arrays so schoen in Klassen stecken kann...
Abgesehen davon, ist ein delete mit delete[] verwechseln ein Anfaengerfehler, mehr nicht.
-
Warum warnt der Compiler eigentlich nicht davor?
-
void foo (char *c) { delete c; //oder lieber delete [] c; } //bei int x; cin >> x; x ? foo(new char) : foo(new char[23]);
weil er es oft einfach nicht wissen kann
-
Erhard Henkes schrieb:
Warum warnt der Compiler eigentlich nicht davor?
Das Frage ich mich auch.
Er kann es zwar oft nicht wissen, andererseits gibt es genügend Situationen wo er es weiss.Zumindest sollte in der Debug Variante ein assert fliegen...