2011-10-28 20 views
5

tengo una variable miembro de clase como esta:cómo liberar std :: vector si no hay memoria del montón

vector<vector<int> > m_stacks; 

Cuando lo pueblan, me gusta esto:

vector<int> v; 
v.push_back(1); 
v.push_back(2); 
m_stacks.push_back(v); 
vector<int> v2; 
v2.push_back(1); 
v2.push_back(2); 
m_stacks.push_back(v2); 

Ahora Me pregunto qué debería hacer en el destructor de clase para liberar m_stacks. No le asigno ningún montón de memoria, así que estoy luchando si realmente necesito hacer algo. Finalmente se me ocurra esto -

vector<vector<int> >::iterator itr = m_stacks.begin(); 
for (; itr != m_stacks.end(); ++itr) { 
    itr->clear(); 
} 

Creo que esto es lo más que tengo que hacer, no necesito llamar m_stacks.clear(). La razón es que el destructor del vector puede liberar automáticamente la memoria. Pero aún necesito el código anterior, la razón es que el vector destructor no llama al destructor de su elemento.

Podría confirmar mi llamada?

Respuesta

14

Usted no tiene que hacer nada para m_stacks (un miembro de datos class). La memoria adquirida se liberará automáticamente cuando se invoque el destructor class. Este es el propósito para el cual se usa std::vector.

6

El destructor std::vector llama a una eliminación en la memoria que asigna, llamando así a ese tipo (en este caso, un destructor std::vector<int>).

Todas estas estructuras de datos confían en los principios SBRM (gestión de recursos vinculados al alcance) o RAII (adquisición de recursos es inicialización), ya que todas las memorias que asignan se desasignan una vez que salen del ámbito (como el alcance una clase).

No necesita preocuparse por la liberación de memoria de un std::vector a menos que tenga un tipo que apunta a la memoria; pero no lo libera inherentemente (¡como un puntero!).

8

El destructor de un vector hará dos cosas: destruirá cada elemento del vector, luego liberará la memoria utilizada para el vector. Esto es automático

En su caso tiene vectores anidados dos profundos, pero no importa. Cuando se destruye el vector de nivel superior llamará al destructor para cada vector que contenga, y todos esos vectores se limpiarán ellos mismos correctamente.

Cuestiones relacionadas