¿Son ciertas todas las siguientes afirmaciones?
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.
¿Cómo se asigna internamente la memoria Type
en un vector
contenedor STL o en otro?
Respuestas:
asignará
vector
, es decir, la información del encabezado, en la pila, pero los elementos en la tienda gratuita ("montón").asigna todo en la tienda gratuita.
asignará el
vector
en la pila y un montón de punteros en la tienda gratuita, pero donde este punto está determinado por cómo los usa (podría señalar el elemento 0 a la tienda libre y el elemento 1 a la pila, por ejemplo).fuente
vector<Type> vect;
dado que los elementos están en el montón y la información del encabezado está en la pila, cuando la información del encabezado se elimina de la memoria, como la función de retorno, ¿qué pasará con las memorias de los elementos? ¿Se reclaman con la información del encabezado o no? Si no lo son, ¿esto causará pérdida de memoria?No,
vect
estará en la pila, pero la matriz que usa internamente para almacenar los elementos estará en el montón. Los artículos residirán en esa matriz.No. Igual que el anterior, excepto que la
vector
clase también estará en el montón.vect
estará en la pila, sus elementos (punteros aType
) estarán en el montón, y no se puede saber dónde estarán losType
s a los que apuntan los punteros. Podría estar en la pila, podría estar en el montón, podría estar en los datos globales, podría estar en ninguna parte (es decir,NULL
punteros).Por cierto, la implementación podría almacenar algunos vectores (típicamente de pequeño tamaño) en la pila por completo. No es que yo sepa de tal implementación, pero puede.
fuente
Suponiendo una implementación que realmente tiene una pila y un montón (C ++ estándar no requiere tener tales cosas), la única declaración verdadera es la última.
Esto es cierto, excepto por la última parte (
Type
no estará en la pila). Imagina:Igualmente:
Verdadero, excepto la última parte, con un ejemplo de contador similar:
Por:
Esto es cierto, pero tenga en cuenta aquí que los
Type*
punteros estarán en el montón, pero lasType
instancias que señalan no necesitan ser:fuente
delete
también).Solo esta afirmación es verdadera:
Type*
los punteros se asignan en el montón, porque la cantidad de punteros puede cambiar dinámicamente.vect
en este caso se asigna en la pila, porque lo definiste como una variable de pila local.fuente
el vector tiene un interno
allocator
que se encarga de asignar / desasignar memoriasheap
paravector element
. Entonces, no importa cómo cree un vector,element
siempre se asigna en elheap
. En cuanto a los metadatos del vector, depende de la forma en que lo cree.fuente