Hay dos cosas separadas aquí:
- objeto vida
- duración de almacenamiento
Por ejemplo:
{
vector<MyObject> v;
// do some stuff, push some objects onto v
v.clear(); // 1
// maybe do some more stuff
} // 2
En 1
, que claro v
: esto destruye toda los objetos que estaba almacenando. Cada uno recibe su destructor llamado, si lo escribió, y todo lo que pertenece a ese MyObject
ahora se ha liberado. Sin embargo,, vector v
tiene derecho a mantener el almacenamiento sin procesar en caso de que lo desee más tarde.
Si decide introducir más elementos entre 1
y 2
, ahorra tiempo ya que puede volver a utilizar la memoria anterior.
En 2
, el vector v
sale del ámbito: cualquier objeto que empuja en él desde 1
serán destruidos (como si hubieras llamado explícitamente claro una vez más), pero ahora el almacenamiento subyacente también se libera (v
won' estar cerca para reutilizarlo más).
Si cambio el ejemplo de modo v
se convierte en un puntero, es necesario eliminar de forma explícita, como el puntero de salir del ámbito en 2
no hacer eso por usted. Es mejor usar algo como std::unique_ptr
en ese caso, pero si no lo hace y se filtra v
, también se filtrará el almacenamiento que asignó. Como se indicó anteriormente, debe asegurarse de que v
se elimine, y llamar al clear
no es suficiente.
No hay nada diferente del segundo caso que el primer caso que no sea el hecho de que señala un vector. Creo que esta pregunta debe ampliarse para que pueda entender cómo debería funcionar la asignación/desasignación de memoria, y probablemente también los indicadores. – Marlon
Este dice que declararlo dentro de una pila de funciones llama automáticamente al destructor al cierre. https://stackoverflow.com/questions/3054567/right-way-to-deallocate-an-stdvector-object –