2011-10-28 7 views
5

ho una variabile membro della classe in questo modo:Come rilasciare std :: vector se non c'è memoria heap

vector<vector<int> > m_stacks; 

Quando io popolo, lo faccio in questo modo:

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); 

Ora Mi chiedo cosa dovrei fare nel distruttore di classe per rilasciare m_stacks. Non alloco memoria di heap per questo, quindi sto lottando se ho davvero bisogno di fare qualcosa. Infine vengo questo -

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

Penso che questo sia il più ho bisogno di fare, non ho bisogno di chiamare m_stacks.clear(). Il motivo è che il distruttore del vettore può rilasciare automaticamente la memoria. Ma ho ancora bisogno del codice di cui sopra, la ragione è che il distruttore del vettore non chiama il distruttore del suo elemento.

Confermare la mia chiamata?

risposta

14

Non è necessario eseguire alcuna operazione per m_stacks (un membro dati class). La memoria acquisita verrà rilasciata automaticamente quando verrà chiamato il distruttore class. Questo è lo scopo per cui viene utilizzato std::vector.

6

Il distruttore std::vector chiama un'eliminazione nella memoria allocata, chiamando in tal modo quel tipo (in questo caso, un distruttore std::vector<int>).

Queste strutture dati fanno affidamento su SBRM (gestione delle risorse legate allo scopo) o RAII (acquisizione delle risorse è inizializzazione), in quanto tutta la memoria allocata viene disallineata una volta che si esce dal campo di applicazione (come lo scopo di una classe).

Non è necessario preoccuparsi del rilascio di memoria da un std::vector a meno che non contenga un tipo che punta alla memoria; ma non lo rilascia intrinsecamente (come un puntatore!).

8

Il distruttore per un vettore farà due cose: distruggerà ogni elemento del vettore, quindi libererà la memoria utilizzata per il vettore stesso. Questo è automatico.

Nel tuo caso hai vettori annidati due in profondità, ma non importa. Quando il vettore di livello superiore viene distrutto, chiamerà il distruttore per ogni vettore che contiene e tutti questi vettori si ripuliranno correttamente.

Problemi correlati