vectors remove pushback how delete c++ memory-management stl vector

remove - vector vector c++



¿Dónde asigna un std:: vector su memoria? (4)

¿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, este será el montón .

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

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

Considere el siguiente fragmento de código:

#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; }

Suponiendo que "vec" no tiene espacio para almacenar el 5 en la función "sub", ¿dónde asigna la 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á.


Como asignó sub la dirección del vector en el montón, se asignará en el montón. Si no queda espacio, debe lanzarse una excepción.


También tenga en cuenta que su vector ( vec ) es el objeto en sí mismo. 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 bello ejemplo del modismo RAII , ya que la gestión de los recursos de los elementos está vinculada a la vida útil del objeto vectorial.


Todos los contenedores en el STL están parametrizados con argumentos de plantilla, por lo general, el último argumento se llama A o Allocator y se predetermina a std::allocator<...> donde ... representa el tipo del valor almacenado en el contenedor.

El 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 envoltorio simple alrededor de ::operator new y, por lo tanto, asignará memoria en el montón como lo dedujo.

La memoria se asigna a petición y, como mínimo, se desasigna cuando se llama al destructor del vector . C ++ 11 introduce shrink_to_fit para liberar memoria más pronto también. Finalmente, cuando el vector supera su capacidad actual, se realiza una asignación nueva (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.