2012-04-28 9 views
21

Considere el siguiente fragmento de código:¿Dónde asigna un std :: vector su memoria?

#include <vector> 
using namespace std; 

void sub(vector<int>& vec) { 
    vec.push_back(5); 
} 

int main() { 
    vector<int> vec(4,0); 
    sub(vec); 
    return 0; 
} 

Asumiendo "vec" no queda espacio para almacenar el 5 en la función de "sub", ¿de dónde asignar nueva memoria?

¿En el marco de pila de la función secundaria? En ese caso, el 5 se eliminará al final de la función secundaria. Pero el marco de pila de la función principal no puede crecer, ya que el marco de pila de la función secundaria se encuentra en la parte superior de la pila en ese momento.
¿Un std :: vector asigna memoria para sus elementos en el montón? Pero, ¿cómo libera esa memoria de montón? Si se trata de un vector local en la pila, el marco de pila de una función que incluye el vector se elimina al final sin indicar al vector que se eliminará.

+0

Es posible que desee ver los asignadores de STL. – pmdj

+3

'sub (vector & vec)' llamado como 'sub (vec)' sería definitivamente más fácil de leer;) – LihO

+0

** Asigna memoria en Heap ** [std :: vector Implementation] (http: // codereview .stackexchange.com/questions/60484/stl-vector-implementation) –

Respuesta

31

¿Un std :: vector asigna memoria para sus elementos en el montón?

Sí. O más exactamente, asigna en función del asignador que ingresas en la construcción. No especificó uno, por lo que obtiene el asignador predeterminado. Por defecto, esto será the heap.

Pero, ¿cómo libera ese montón de memoria?

A través de su destructor cuando se sale del alcance. (Tenga en cuenta que un puntero a un vector que sale del alcance no activará el destructor). Pero si hubiera pasado por valor a sub, construiría (y luego destruiría) una nueva copia. 5 se volvería a colocar en esa copia, la copia se limpiaría y el vector en main quedaría intacto.

+0

No vi la página http://www.cplusplus.com/reference/std/memory/allocator/allocate/ mencionó nada acerca de la asignación predeterminada en el montón? – athos

0

Dado que le dio a sub la dirección del vector en el montón, se asignará en el montón. Si no queda espacio, debe emitirse una excepción.

+2

No hay absolutamente ningún enlace entre un vector en el montón, y asignando su memoria en el montón. –

+0

sin obtener lo que quiere decir, por favor exlpain. – Stefan

+0

El vector no está en "el montón", sea lo que sea. Está en la pila de 'main'. – juanchopanza

16

todos los contenedores del STL se parametrizan con argumentos de plantilla, por lo general el último argumento se llama A o Allocator y por defecto std::allocator<...> donde ... representa el tipo del valor almacenado dentro del recipiente.

La Allocator es una clase que se utiliza para proporcionar memoria y construir/destruir los elementos en esta área de memoria. Puede asignar memoria desde un grupo o directamente desde el montón, cualquiera que sea que genere el asignador. De forma predeterminada, el std::allocator<T> es un contenedor simple alrededor de ::operator new y asignará la memoria en el montón como se deduce.

La memoria se asigna a petición y se desasigna al menos cuando se llama al destructor vector. C++ 11 introduce shrink_to_fit para liberar memoria más rápido también. Finalmente, cuando el vector supera su capacidad actual, se realiza una nueva asignación (más grande), los objetos se mueven hacia ella y se libera la asignación anterior.

Al igual que todas las variables locales, se llama al destructor cuando se ejecuta alcanza el final del alcance en el que se ha declarado. Entonces, antes de salir de la función, se llama al vector destructor, y solo después la pila se encoge y el control regresa a la persona que llama.

2

También tenga en cuenta que su vector (vec) es el objeto en sí.Reside en la pila y cuando este objeto queda fuera del alcance (que es el final de main en su caso), se destruye. La memoria para los elementos se asigna durante la inicialización de este objeto y se libera con su destrucción, que es un precioso ejemplo del modismo RAII, ya que la gestión de recursos de los elementos está vinculada a la vida útil del objeto vector.

Cuestiones relacionadas