Memory Allocation und Deletion



  • Hey

    Ich bin gerade etwas verwirrt wie der folgende Programm semantisch abläuft. Unten seht ihr zwei kleine Programmeausschnitte. Stimmt der Ablauf so wie ich ihn in den Kommentaren geschrieben habe?

    Programmteil 1:

    class Foo
    {
    public:
    	int a;
    
    	Foo ( int a_i ) : a( a_i ) {}
    };
    
    std::vector<Foo> vec;
    
    void foo1()
    {
    	Foo f1(0); // f1 kommt auf den Stack
    	Foo f2(1); // f2 kommt auf den Stack
    
    	vec.push_back( f1 ); // f1 wird kopiert
    	vec.push_back( f2 ); // f2 wird kopiert
    } // f1, f2 werden vom Stack gelöscht
    

    Programmteil 2:

    class Foo
    {
    public:
    	int a;
    
    	Foo ( int a_i ) : a( a_i ) {}
    };
    
    std::vector<Foo*> vec;
    
    void foo2()
    {
    	Foo* f1 = new Foo(0); // f1 kommt auf den Stack
    	Foo* f2 = new Foo(1); // f2 kommt auf den Stack
    
    	vec.push_back( f1 ); // Adresse auf f1 wird übergeben
    	vec.push_back( f2 ); // Adresse auf f2 wird übergeben
    } // Kein memory leak (?)
    

    Ich müsste das eigentlich wissen aber ich bin gerade ziemlich verunsichert.

    PS:
    Die Beispiele sind natürlich nicht sinnvoll. Ich will nur wissen, ob ich mir den Ablauf korrekt vorstelle.



  • Nein stimmt nicht. Im Programmteil 2 werden die Objekte auf dem Heap erzeugt. Nur die Zeiger liegen auf dem Stack. Da du die Zeiger auf die Objekte in den vector kopierts, gibt es am Ende von foo2 erstmal kein Memory-Leak. Du musst aber die Objekte löschen, bevor du die Zeiger auf sie verlierst. In deinem konkreten Beispiel wäre das nie notwendig, weil dein vector im globalen Bereich liegt. Dort wird der Speicher automatisch beim Verlassen der Anwendung frei gegeben. Es schadet aber nicht für jedes new auch ein delete zu haben, so wie du es gelernt hast.



  • Mir ist klar, dass die Objekte in foo2() auf den Heap kommen. Habe Copy Paste gemacht und dann vergessen Stack durch Heap zu ersetzen ^^

    Ja, normalerweise brauche ich sowiso kein "offenes" delete. Da nehm ich dann Smart Pointer.

    Danke für die Antwort 🙂



  • Nick Unbekannt schrieb:

    Du musst aber die Objekte löschen, bevor du die Zeiger auf sie verlierst. In deinem konkreten Beispiel wäre das nie notwendig, weil dein vector im globalen Bereich liegt. Dort wird der Speicher automatisch beim Verlassen der Anwendung frei gegeben. Es schadet aber nicht für jedes new auch ein delete zu haben, so wie du es gelernt hast.

    das kommt aufs betriebsystem an...

    windows und linux machen das in der aktuellsten version, aber vor 10~15 jahren wars vielleicht nicht so
    und andere betriebssysteme machen das vielleicht auch nicht...

    EDIT: zu jedem new/new[] gehört ein delete/delete[]


Log in to reply