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
newanforderst, musst du auch selber wieder mitdeletefreigeben. Membervariablen wie bei dir derstd::vectorwerden im Destruktor der Klasse zerstört, bei dir geschieht das durch diedelete-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
newim Fehlerfall einestd::bad_alloc-Exception wirft und nicht den Nullzeiger zurückgibt. Das wäre das Placement New mitstd::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_allocwird 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_allocwird 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.