new und delete[] - Frage



  • Ich habe ein Programm, in dem ich in einer Funktion new und am Ende der Funktion delete[] aufrufe. Ist das delete[] notwendig oder wird der Speicher automatisch freigegeben, sobald der Scope des mit new gespeicherten Speichers endet (nach return )?

    Danke.



  • HELPVISTAWIN7 schrieb:

    Ich habe ein Programm, in dem ich in einer Funktion new und am Ende der Funktion delete[] aufrufe. Ist das delete[] notwendig oder wird der Speicher automatisch freigegeben, sobald der Scope des mit new gespeicherten Speichers endet (nach return )?

    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...).


  • Mod

    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 new und am Ende der Funktion delete[] aufrufe. Ist das delete[] notwendig oder wird der Speicher automatisch freigegeben, sobald der Scope des mit new gespeicherten Speichers endet (nach return )?

    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.


Anmelden zum Antworten