Speicherfreigabe eines Vectors in dynamisch erzeugter Klasse.



  • Hallo,
    ich habe ne Klasse mit nem Vector drin:

    class A
    {
    	vector <string> a;
    public:
    	void add_a (string s)
    	{
    		a.push_back(s);
    	}
    };
    

    In einer Erzeugerfunktion werden Klassen generiert:

    A* Create_A()
    {
    	A* pA = new A;
    	if ( pA != NULL )
    		pA->add_a("a");
    	return pA;
    }
    

    Wie ist das mit der Freigabe des Speichers für den Vector, wird beim delete in Zeile 10 der vom Vector belegte Speicher automatisch freigegeben?
    Der Aufruf von delete ist ja kein Verlassen eines Blocks (Scopes) 😕

    int main() 
    { 
    	A* ppA[10];
    	for ( int i=0; i<10; i++ )
    	{
    		ppA[i] = Create_A();
    	}
    
    	for ( int i=0; i<10; i++ )
    		delete ppA[i];
    ...
    


  • Was du mit new anforderst, musst du auch selber wieder mit delete freigeben. Membervariablen wie bei dir der std::vector werden im Destruktor der Klasse zerstört, bei dir geschieht das durch die delete -Anweisung. In deinem Fall gibst du richtig frei, allerdings würde ich eher eine entsprechende Freigabefunktion erstellen, damit du Allokation und Deallokation am selben Ort hast.

    if ( pA != NULL )
    

    Die Abfrage bringt rein gar nichts, da new im Fehlerfall eine std::bad_alloc -Exception wirft und nicht den Nullzeiger zurückgibt. Das wäre das Placement New mit std::nothrow .



  • Ok, der Vector gibt sich beim delete Aufruf quasi selbst frei.
    Bei der Sache mit dem NULL Zeiger (std::bad_alloc, std::nothrow) macht man das mit try-catch oder was meinst du damit?



  • Ja, wenn du die normale new -Version nutzt, schon.

    Allerdings solltest du dir um solche Dinge momentan keine Gedanken machen, std::bad_alloc wird sehr sehr selten geworfen. Konzentrier dich lieber darauf, andere Dinge richtig zu lernen. 😉



  • Ok, ich lasse das

    if ( pA != NULL )
    

    einfach weg.



  • Nexus schrieb:

    Allerdings solltest du dir um solche Dinge momentan keine Gedanken machen, std::bad_alloc wird sehr sehr selten geworfen.

    Um eventuelle Befürchtungen zu verhindern: Das passiert in der Regel nur bei folgenden 2 Situationen:

    • Arbeitsspeicher ist voll
    • Zu viel Speicher wurde auf einmal angefordert (ist oft das gleiche wie der 1. Punkt)

    Da der RAM auf heutigen PCs selten voll wird, muss man sich also keine Gedanken über std::bad_alloc machen.


Anmelden zum Antworten