new und delete[] - Frage
-
Ich habe ein Programm, in dem ich in einer Funktion
newund am Ende der Funktiondelete[]aufrufe. Ist dasdelete[]notwendig oder wird der Speicher automatisch freigegeben, sobald der Scope des mitnewgespeicherten Speichers endet (nachreturn)?Danke.
-
HELPVISTAWIN7 schrieb:
Ich habe ein Programm, in dem ich in einer Funktion
newund am Ende der Funktiondelete[]aufrufe. Ist dasdelete[]notwendig oder wird der Speicher automatisch freigegeben, sobald der Scope des mitnewgespeicherten Speichers endet (nachreturn)?Grundsätzlich werden Heapvariablen (new/new[]) nicht automatisch freigegeben. C++ hat keinen Garbagecollector. Stackvariablen werden am Ende des scopes freigegeben.
Grundsätzlich gilt zu jedem new[] ein delete[], und zu jedem new ein delete.
Wenn man schon Heapvariablen benötigt, gibt es Alternativen zur manuellen Freigabe (z.B. "Smartpointer", Pointercontainer von boost...).
-
asc schrieb:
Wenn man schon Heapvariablen benötigt,
Wobei man sagen sollte, dass der hier beschriebene Fall von am anfang der Funktion reservieren und am Ende freigeben ein Paradebeispiel für den Fall ist, in dem man Heapvariablen nicht braucht.
-
SeppJ schrieb:
asc schrieb:
Wenn man schon Heapvariablen benötigt,
Wobei man sagen sollte, dass der hier beschriebene Fall von am anfang der Funktion reservieren und am Ende freigeben ein Paradebeispiel für den Fall ist, in dem man Heapvariablen nicht braucht.
Die Aussage mag häufig stimmen, gilt aber nicht allgemein (z.B. benötige ich dies recht häufig, da ich an der Arbeit ein Framework verwende das Heapvariablen erfordert).
-
HELPVISTAWIN7 schrieb:
Ich habe ein Programm, in dem ich in einer Funktion
newund am Ende der Funktiondelete[]aufrufe. Ist dasdelete[]notwendig oder wird der Speicher automatisch freigegeben, sobald der Scope des mitnewgespeicherten Speichers endet (nachreturn)?new/delete bzw new[]/delete[] ist gerade dazu da, dass man als Benutzer die Lebenszeit des reservierten Speichers genau kontrollieren kann. Wenn Du über new[] Speicher reservierst und dir den resultierenden Zeiger als automatische Variable merkst:
void foo() { int* p = new int; }dann gibt es hier zwei Objekte, die eine Rolle spielen.
1. Die Zeigervariable p liegt im automatischen Speicherbereich und wird damit automatisch beim Verlassen der Funktion aufgeräumt.
2. Das per new erzeugte int-Objekt liegt im Freispeicher. Wenn Du Dich nicht selbst um das Löschen kümmerst, bleibt das Objekt bis zum Ende des Programms im Speicher hängen.In diesen Beispiel hat die Funktion foo ein Speicherleck, denn der reservierte Speicher wird nie freigegeben.
new[]/delete[] braucht man höchst selten. Die besseren Alternativen sind die Standard-Container. Um new/delete kommt man auch mahcnmal rum. Wenn nicht, sollte man die Verantwortung, Objekte zu löschen oder andere Resourcen freizugeben, frühstmöglich an andere Objekte delegieren. So kann man zB ein auto_ptr-Objekt oder einen Boost-Pointer-Container ein dynamisch erzeugtes Objekt "besitzen lassen" so dass man sich nicht mehr selbst und das Freigeben kümmern muss.