Desasignar un objeto std::vector en C++
Este artículo explicará cómo podemos desasignar los objetos std::vector
en C++/C. Primero, veremos las formas autocodificadas de desasignación, y después de eso, examinaremos cómo los objetos std::vector
se desasignan dinámicamente en C++.
Desasignar objetos en C++
Cuando se crea un objeto de clase en C++, se llama automáticamente a la función miembro especial conocida como constructor
, que inicializa el objeto con algunos valores predeterminados. De manera similar, se llama automáticamente a una función miembro especial destructor
cuando el objeto creado queda fuera del alcance.
Esta función destructora
libera toda la memoria ocupada por el objeto creado. Este proceso de liberar la memoria ocupada por el objeto se conoce como desasignación.
el objeto std::vector
En C++, std
es un espacio de nombres y el operador ::
es un operador de alcance. Este operador de alcance le dice al compilador qué clase/espacio de nombres debe buscar el identificador/clase.
Si la expresión es como std::cout
, significa buscar el identificador cout
en el espacio de nombres std
. De manera similar, std::vector
significa buscar una clase de vector en el espacio de nombres std
.
Para la desasignación, primero, necesitamos crear un objeto de la clase vector
. Para eso, podemos usar el siguiente código con el compilador GCC C++11:
#include <iostream>
#include <vector>
int main() {
// Create a vector containing integers
std::vector<int> v = {7, 5, 16, 8};
}
El espacio de nombres std
contiene varias bibliotecas de C++ en el código anterior. Primero agregamos explícitamente la biblioteca vector
y la usamos para inicializar el vector con el tipo std::vector<int>
.
Formas autocodificadas de desasignación de vectores en C++
En el siguiente código, escribimos explícitamente los comandos para eliminar el vector. Esto solo se aplica cuando usa la palabra clave nuevo
para crear los vectores.
El operador nuevo
señala una solicitud de asignación de memoria en la Tienda gratuita. Un operador nuevo
asignará la memoria si hay suficiente espacio, la inicializará y luego proporcionará la ubicación de la memoria recién creada e inicializada a la variable de puntero.
En el siguiente código, primero inicializamos el puntero del vector, luego verificamos si era NULL
o no. Después de hacer nuestro cálculo requerido, nos aseguramos a través de la declaración afirmar
que el puntero del vector no está vacío.
Luego eliminamos el vector y su espacio ocupado usando la instrucción eliminar
.
#include <cassert>
#include <iostream>
#include <vector>
using namespace std;
int main() {
std::vector<int>* vec = new std::vector<int>;
\\*** assert(vec != NULL);
delete vec;
return 0;
}
Usando el siguiente código, liberamos la memoria asignada por vec
asignando un vector vacío después de hacer los cálculos necesarios. El comando std::vector<int>()
crea un vector vacío con cero bytes.
La última sentencia comprueba la memoria ocupada por vec
en bytes.
std::vector<int> vec;
\\***
\\*** vec = std::vector<int>();
std::cout << sizeof(decltype(vec.back())) * vec.capacity() << std::endl;
Formas dinámicas de desasignación de vectores en C++
En C++, cuando define un objeto std::vector
dentro de una función (es decir, dentro de {....}
), se llama automáticamente al constructor de la clase vector, que inicializa el objeto vector. Cuando finaliza la ejecución de la función (es decir, llega al corchete de cierre }
), se llama automáticamente al destructor.
Por ejemplo,
void Foo() {
std::vector<int> v;
...
}
C++ garantiza que se llamará al destructor de v
cuando se ejecute el método. El destructor de std::vector
se asegurará de que se libere cualquier memoria asignada.