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.
fonte
2010-05-07 21:08:31
quando dici che gestirà la memoria stessa, vuoi dire dopo che chiamo a vector.clear()? – TheFuzz
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. –
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