Heben Sie die Zuweisung eines std::vector-Objekts in C++ auf
Dieser Artikel erklärt, wie wir die std::vector
-Objekte in C++/C freigeben können. Zuerst werden wir die selbstcodierten Möglichkeiten der Freigabe sehen und danach untersuchen, wie die std::vector
-Objekte in C++ dynamisch freigegeben werden.
Objekte in C++ freigeben
Wenn ein Klassenobjekt in C++ erstellt wird, wird automatisch die spezielle Elementfunktion namens Konstruktor
aufgerufen, die das Objekt mit einigen Standardwerten initialisiert. In ähnlicher Weise wird automatisch eine spezielle Elementfunktion Destruktor
aufgerufen, wenn das erstellte Objekt den Gültigkeitsbereich verlässt.
Diese Destruktor
-Funktion gibt den gesamten vom erstellten Objekt belegten Speicher frei. Dieser Vorgang des Freigebens des vom Objekt belegten Speichers wird als Freigabe bezeichnet.
das std::vector
-Objekt
In C++ ist std
ein Namensraum und der Operator ::
ein Bereichsoperator. Dieser Bereichsoperator teilt dem Compiler mit, in welcher Klasse/Namespace er nach dem Bezeichner/der Klasse suchen soll.
Wenn der Ausdruck wie std::cout
ist, bedeutet dies, dass nach der Kennung cout
im Namensraum std
gesucht wird. Ähnlich bedeutet std::vector
, dass man im Namensraum std
nach einer Vektorklasse sucht.
Für die Freigabe müssen wir zuerst ein Objekt der Klasse Vektor
erstellen. Dafür können wir den folgenden Code mit dem GCC-Compiler C++11 verwenden:
#include <iostream>
#include <vector>
int main() {
// Create a vector containing integers
std::vector<int> v = {7, 5, 16, 8};
}
Der Namensraum std
enthält mehrere C++-Bibliotheken im obigen Code. Wir haben zuerst explizit die Bibliothek vector
hinzugefügt und damit den Vektor mit dem Typ std::vector<int>
initialisiert.
Selbstcodierte Möglichkeiten der Vektorzuordnung in C++
Im folgenden Code haben wir explizit die Befehle zum Löschen des Vektors geschrieben. Dies gilt nur, wenn Sie zum Erstellen der Vektoren das Schlüsselwort new
verwenden.
Der new
-Operator signalisiert eine Anfrage zur Speicherzuweisung auf dem Free Store. Ein new
-Operator weist den Speicher zu, wenn genügend Platz vorhanden ist, initialisiert ihn und gibt dann den Ort des neu erstellten und initialisierten Speichers an die Zeigervariable weiter.
Im folgenden Code haben wir zuerst den Vektorzeiger initialisiert und dann überprüft, ob er NULL
war oder nicht. Nachdem wir unsere erforderliche Berechnung durchgeführt hatten, stellten wir durch die assert
-Anweisung sicher, dass der Vektorzeiger nicht leer ist.
Dann haben wir den Vektor und seinen belegten Platz mit der Anweisung delete
entfernt.
#include <cassert>
#include <iostream>
#include <vector>
using namespace std;
int main() {
std::vector<int>* vec = new std::vector<int>;
\\*** assert(vec != NULL);
delete vec;
return 0;
}
Mit dem folgenden Code haben wir den zugewiesenen Speicher durch vec
frei gemacht, indem wir nach den erforderlichen Berechnungen einen leeren Vektor zugewiesen haben. Der Befehl std::vector<int>()
erzeugt einen leeren Vektor mit null Bytes.
Die letzte Anweisung prüft den belegten Speicher durch vec
in Bytes.
std::vector<int> vec;
\\***
\\*** vec = std::vector<int>();
std::cout << sizeof(decltype(vec.back())) * vec.capacity() << std::endl;
Dynamische Wege der Vektorfreigabe in C++
Wenn Sie in C++ ein std::vector
-Objekt innerhalb einer Funktion definieren (d. h. innerhalb von {....}
), wird automatisch der Vektorklassenkonstruktor aufgerufen, der das Vektorobjekt initialisiert. Wenn die Ausführung der Funktion endet (d. h. die schließende Klammer }
erreicht), wird der Destruktor automatisch aufgerufen.
Zum Beispiel,
void Foo() {
std::vector<int> v;
...
}
C++ garantiert, dass der Destruktor von v
aufgerufen wird, wenn die Methode ausgeführt wird. Der Destruktor von std::vector
stellt sicher, dass der zugewiesene Speicher freigegeben wird.