2012-05-10 9 views
6

Angenommen, ich habe VectorA und VectorB sind zwei std::vector<SameType>, beide initilized (ich meine VectorA.size() > 0 und VectorB.size() > 0)Speicher de-Zuordnung mit std :: vector Neuzuordnung

Wenn ich tun:

VectorA = VectorB; 

die Speicher, der zuvor für VectorA zugewiesen wurde, wird automatisch freigegeben?

+2

Ja, es ist freigegeben. – tuxuday

Antwort

5

Es wird in dem Sinne freigegeben, dass die Destruktoren aller enthaltenen Objekte aufgerufen werden und der Vektor nicht mehr den Speicher besitzt.

Aber wirklich, es ist nur an die allocator zurückgegeben, die es möglicherweise tatsächlich an das Betriebssystem zurückgeben kann.

Solange kein Fehler in dem verwendeten Zuordner vorhanden ist, haben Sie kein Speicherleck erstellt, wenn dies Ihr Anliegen ist.


1. Wie @ David in dem unten stehenden Kommentar weist darauf hin, wird der Speicher nicht notwendigerweise ausgeplant, je nachdem, ob die Größe oder nicht geändert werden muss.

+1

Die Zuweisung muss den alten Puffer nicht neu zuordnen, kopieren und freigeben, wenn der Zielvektor über genügend Kapazität verfügt. Es muss auch nicht die alten Objekte zerstören, sondern kann den * Zuweisungsoperator * verwenden, um die ersten 'min (v1.size(), v2.size())' Elemente * neu zu schreiben (vorausgesetzt, dass es nicht benötigt wird) neu zuweisen. –

2

Im Allgemeinen nicht unbedingt. Wenn Sie dem anderen einen Vektor zuweisen, lautet die Nachbedingung, dass beide Arrays am Ende der Operation äquivalente Objekte enthalten.

Wenn die capacity des Zielvektors genug ist, kann der Vorgang durch Aufruf des Zuweisungsoperator auf dem Satz von min(v1.size(), v2.size()) Elementen erreicht werden, und dann entweder zerstörenden den Rest der Elemente, wenn der Zielvektor mehr Elemente gehalten wird, oder sonst copy-constructing die zusätzlichen Elemente am Ende. In diesem Fall wird keine Speicherfreigabe oder -zuweisung durchgeführt.

Wenn der Zielvektor nicht genügend Kapazität hat, erstellt er einen neuen Puffer mit genügend Kapazität und copy-construct die Elemente in dem neuen Puffer aus dem Quellvektor. Es wird dann den alten und den neuen Puffer austauschen, alle alten Objekte zerstören und den alten Puffer freigeben. In diesem Fall werden die alten Objekte zerstört und der alte Speicher freigegeben, aber das ist nur ein Fall.

Verwandte Themen