una - vectores c++ ejemplos
C++ eliminar vector, objetos, memoria libre (4)
Aquí hay dos cosas separadas:
- objeto de por 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
, borra v
: esto destruye todos los objetos que estaba almacenando. Cada uno obtiene su destructor llamado, si lo escribió, y todo lo que pertenece a ese MyObject
ahora está disponible. Sin embargo , el vector v
tiene derecho a mantener el almacenamiento sin procesar en caso de que lo desee más adelante.
Si decide insertar más elementos entre 1
y 2
, ahorrará tiempo, ya que puede reutilizar la memoria anterior.
En 2
, el vector v
queda fuera del alcance: cualquier objeto que haya insertado en él desde 1
se destruirá (como si hubiera llamado explícitamente de nuevo a borrar), pero ahora también se libera el almacenamiento subyacente ( v
no estará disponible para reutilizarlo más).
Si cambio el ejemplo para que v
convierta en un puntero, debe eliminarlo explícitamente, ya que el puntero que sale del alcance en 2
no lo hace por usted. Es mejor usar algo como std::unique_ptr
en ese caso, pero si no lo hace y v
se filtró, el almacenamiento que asignó se filtrará también. Como se indicó anteriormente, debe asegurarse de que v
se elimine, y no es suficiente llamar.
Estoy totalmente confundido con respecto a eliminar cosas en C ++ si declaro una matriz de objetos y si utilizo la función clear()
. ¿Puedo estar seguro de que la memoria fue lanzada?
Por ejemplo :
tempObject obj1;
tempObject obj2;
vector<tempObject> tempVector;
tempVector.pushback(obj1);
tempVector.pushback(obj2);
¿Puedo llamar claro para liberar toda la memoria? ¿O necesito iterar para eliminar uno por uno?
tempVector.clear();
Si este escenario se cambia a un puntero de objetos, ¿la respuesta será la misma que la anterior?
vector<tempObject> *tempVector;
//push objects....
tempVector->clear();
Puede llamar a clear, y eso destruirá todos los objetos, pero eso no liberará la memoria. Pasar por los elementos individuales tampoco ayudará (¿qué acción propondrías llevar a cabo sobre los objetos?) Lo que puedes hacer es esto:
vector<tempObject>().swap(tempVector);
Eso creará un vector vacío sin memoria asignada y lo intercambiará con tempVector, desasignando de manera efectiva la memoria.
C ++ 11 también tiene la función shrink_to_fit
, que se puede llamar después de la llamada a clear (), y en teoría reduciría la capacidad para ajustarse al tamaño (que ahora es 0). Sin embargo, esta es una solicitud no vinculante, y su implementación puede ignorarla.
Si necesita usar el vector una y otra vez y su código actual lo declara repetidamente dentro de su ciclo o en cada llamada de función, es probable que se quede sin memoria. Le sugiero que lo declare afuera, páselos como punteros en sus funciones y use:
my_arr.resize()
De esta manera, sigues usando la misma secuencia de memoria para tus vectores en lugar de solicitar nuevas secuencias cada vez. Espero que esto haya ayudado. Nota: cambiar el tamaño a diferentes tamaños puede agregar valores aleatorios. Pase un número entero como 0 para inicializarlos, si es necesario.
vector::clear()
no libera la memoria asignada por el vector para almacenar objetos; llama destructores para los objetos que contiene.
Por ejemplo, si el vector usa una matriz como almacén de respaldo y actualmente contiene 10 elementos, al llamar a clear()
se llamará al destructor de cada objeto en la matriz, pero la matriz de respaldo no se desasignará , por lo que todavía hay sizeof(T) * 10
bytes asignados al vector (al menos). size()
será 0, pero size()
devuelve la cantidad de elementos en el vector, no necesariamente el tamaño de la tienda de respaldo.
En cuanto a su segunda pregunta, cualquier cosa que asigne con new
debe desasignar con delete
. Por lo general, no mantiene un puntero a un vector por este motivo. Rara vez (si alguna vez) hay una buena razón para hacer esto e impide que el vector se limpie cuando sale del alcance. Sin embargo, llamar a clear()
seguirá actuando de la misma manera independientemente de cómo se haya asignado.