vectores una programacion matriz matrices llenar ingresar ejemplos datos como clase c++ vector delete-operator

una - vectores c++ ejemplos



C++ eliminar vector, objetos, memoria libre (4)

Aquí hay dos cosas separadas:

  1. objeto de por vida
  2. 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.