2010-05-07 27 views
5
vector<int> vect; 
int *int_ptr = new int(10); 
vect.push_back(*int_ptr); 

I sotto che ogni "nuovo" deve essere seguito da un "Elimina" ad un certo punto ma il metodo clear() pulisce questa memoria?Domanda di allocazione memoria C++ che coinvolge i vettori

Che dire di questo metodo di fare la stessa cosa:

vector<int> vect; 
int int_var = 10; 
vect.push_back(int_var); 

Da quello che ho capito, chiaro() chiama le variabili distruttori, ma entrambi i metodi vect.push_back() In questo esempio spingere un oggetto sulla vettore, non un puntatore. così il primo esempio che usa un puntatore int ha bisogno di qualcosa di diverso da clear() per ripulire la memoria?

risposta

5

Il primo metodo perde perché il vettore non assume mai la proprietà del puntatore assegnato. Infatti, non contiene affatto un puntatore, solo una copia del valore.

Il secondo metodo non perde, in quanto nessuna memoria viene allocata dinamicamente (tranne internamente nel vettore - gestirà tale memoria stessa).

+0

quando dici che gestirà la memoria stessa, vuoi dire dopo che chiamo a vector.clear()? – TheFuzz

+0

La memoria verrà ripristinata quando il vettore viene distrutto. 'clear()' non rilascia effettivamente alcuna memoria; il vettore manterrà la capacità nel caso in cui abbia bisogno di crescere di nuovo in seguito. –

+0

Quindi, cosa mi impedisce di non usare affatto i puntatori e semplicemente di creare variabili temporanee dello stack e di spingerle sul vettore quando ne ho bisogno? per qualche motivo i puntatori hanno perso il loro punto. – TheFuzz

5

Quando si push_back on a vector, si aggiunge uno copia dei dati nel vettore. Pertanto, in entrambi i casi, i dati originali devono ancora essere liberati. Nel primo caso, è necessario eliminarlo; nel secondo, verrà "liberato" dal puntatore dello stack mentre esce dall'ambito.

2

I vettori eseguono le copie su push_back. Dal momento che un puntatore è "solo un'altra variabile" (ma uno che punta alla memoria), quando si preme un puntatore intero che è stato precedentemente assegnato, si copia il valore del puntatore nel vettore, causando un potenziale puntatore penzolante, poiché ci sarà essere due puntatori che puntano allo stesso punto in memoria.

Nel primo esempio, è necessario eliminare la memoria manualmente. Una strategia che ho usato in passato per immischiarsi con le classi grafico è di avere qualcosa di simile (una grande quantità di roba redatte a causa di essere al lavoro e digitando velocemente):

class graph //quick-format 
{ 
vector<node*> nodes; 
add_node(node n) 
{ 
    node *temp = new node; 
    *temp = n; 
    nodes.push_back(temp) 
} 
~graph() 
{ 
    for(int i = 0; i < nodes.size(); i++) 
     delete nodes[i]; 
} 
}; 

Come un avvertimento, semantica di copia del grafico dovrà essere esaminato Così com'è, risulterà nell'eliminare la memoria precedentemente libera. Il vantaggio è che puoi sempre avere lo stesso set di nodi in giro. Caveat Emptor, come qualsiasi utilizzo della memoria diretta ..

Tuttavia, se si preme semplicemente una variabile non puntatore, non c'è possibilità di perdita di memoria dalla propria estremità. Forse il vettore colerà, ma ... è praticamente impossibile a questo punto nella maturità degli strumenti.

Problemi correlati