Sind alle folgenden Aussagen wahr?
vector<Type> vect; //allocates vect on stack and each of the Type (using std::allocator) also will be on the stack
vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack
vector<Type*> vect; //vect will be on stack and Type* will be on heap.
Wie wird der Speicher intern Type
in einem vector
oder einem anderen STL-Container zugewiesen ?
Antworten:
ordnet die
vector
, dh die Header-Informationen, dem Stapel zu, aber die Elemente im freien Speicher ("Heap").ordnet alles im freien Laden zu.
ordnet das
vector
auf dem Stapel und eine Reihe von Zeigern auf dem freien Speicher zu, aber wo dieser Punkt bestimmt wird, hängt davon ab, wie Sie sie verwenden (Sie könnten beispielsweise Element 0 auf den freien Speicher und Element 1 auf den Stapel zeigen).quelle
vector<Type> vect;
da sich die Elemente auf dem Heap befinden und sich die Header-Informationen auf dem Stapel befinden, was passiert mit den Elementspeichern, wenn die Header-Informationen wie die Funktionsrückgabe aus dem Speicher entfernt werden? Werden sie mit den Header-Informationen zurückgefordert oder nicht? Wenn dies nicht der Fall ist, führt dies zu einem Speicherverlust?Nein,
vect
befindet sich auf dem Stapel, aber das Array, das intern zum Speichern der Elemente verwendet wird, befindet sich auf dem Heap. Die Elemente befinden sich in diesem Array.Nein. Wie oben, außer dass die
vector
Klasse ebenfalls auf dem Haufen liegt.vect
befindet sich auf dem Stapel, seine Elemente (Zeiger aufType
) befinden sich auf dem Heap, und Sie können nicht sagen, auf welcheType
s die Zeiger zeigen. Könnte auf dem Stapel sein, könnte auf dem Heap sein, könnte in den globalen Daten sein, könnte nirgendwo sein (dhNULL
Zeiger).Übrigens könnte die Implementierung tatsächlich einige Vektoren (typischerweise von geringer Größe) vollständig auf dem Stapel speichern. Nicht dass ich von einer solchen Implementierung wüsste, aber es kann.
quelle
Unter der Annahme einer Implementierung, die tatsächlich einen Stapel und einen Heap enthält (Standard-C ++ erfordert solche Dinge nicht), ist die einzig wahre Aussage die letzte.
Dies gilt bis auf den letzten Teil (
Type
wird nicht auf dem Stapel sein). Vorstellen:Gleichfalls:
Richtig mit Ausnahme des letzten Teils mit einem ähnlichen Gegenbeispiel:
Zum:
Dies ist wahr, aber beachten Sie hier, dass sich die
Type*
Zeiger auf dem Heap befinden, aber dieType
Instanzen, auf die sie verweisen, müssen nicht sein:quelle
delete
auch) verwaltet.Nur diese Aussage ist wahr:
Type*
Zeiger werden auf dem Heap zugewiesen, da sich die Anzahl der Zeiger dynamisch ändern kann.vect
In diesem Fall wird der Stapel zugewiesen, da Sie ihn als lokale Stapelvariable definiert haben.quelle
Der Vektor hat einen internen,
allocator
der für die Zuweisung / Freigabe von Speichern vonheap
für die zuständig istvector element
. Egal wie Sie einen Vektor erstellen, erelement
wird immer auf dem Vektor zugewiesenheap
. Die Metadaten des Vektors hängen davon ab, wie Sie ihn erstellen.quelle