std::vector
gestiona su propia memoria. Eso significa que, cuando se invoca el destructor de un vector, se libera la memoria retenida por el vector. std::vector
también invoca el destructor de un objeto cuando se elimina (a través de erase
, pop_back
, clear
o el destructor del vector).
Al hacer esto:
Radio newradio(radioNum);
m_radios.push_back(newradio);
se agrega una copia de newradio
(creada usando Radio
's constructor de copia) al vector. newradio
se destruirá cuando salga del alcance, y la copia se destruirá cuando se elimine del vector (como para cualquier objeto).
Ese es un punto importante: std::vector
sólo almacena copias de un objeto, lo que significa que el objeto debe tener un constructor de copia significativa (y un operador de asignación, pero eso es otro tema). Si tiene un vector de punteros, se copiará el puntero y no a qué apunta. Tenga en cuenta que este comportamiento es el mismo para cada contenedor estándar (como std::list
o std::set
).
Como regla general, si no está utilizando punteros, entonces no tiene que preocuparse de liberar la memoria usted mismo.
En C++ 11, los contenedores estándar de la mayoría (incluyendo vector
) tienen un método de emplace_back
que construye un objeto en lugar en el extremo del recipiente. Toma un montón de parámetros y llama al constructor que mejor se ajusta a esos parámetros (o falla si no existe ese constructor), utilizando dicho constructor para crear el objeto, sin ninguna copia, al final del contenedor. Por lo tanto, el código anterior podría ser reescrita como:
m_radios.emplace_back(radioNum); // construct a Radio in place,
// passing radioNum as the constructor argument
También en C++ 11, los contenedores están normalmente mover consciente, por lo que ya no requieren objetos para ser copiable: si son móvil, entonces el contenedor moverá su contenido según sea necesario (como durante las reasignaciones, por ejemplo). Los tipos que se pueden copiar aún son necesarios si quiere copiar el vector.
Aunque correcta en el momento, esta respuesta podría utilizar una actualización mencionar 'emplace_back' –
Muy buen punto Sr. Pato. –