Std :: vector chiama il distruttore dei puntatori agli oggetti?

Possibile duplicato:
Eliminazione di puntatori in un vettore

So quando un std::vector viene distrutto, chiamerà il distruttore di ciascuno dei suoi elementi. Chiama il distruttore dei puntatori agli oggetti?

 vector stuff; 

Quando la roba viene distrutta, i singoli oggetti puntati dai puntatori all’interno della roba vengono distrutti?

No.

In che modo std::vector dovrebbe sapere come distruggere l’object puntato? Dovrebbe usare delete ? delete[] ? free ? Qualche altra funzione? Come si deve sapere che gli oggetti appuntiti sono effettivamente allocati dynamicmente o che è l’unico vero proprietario ed è responsabile della loro distruzione?

Se std::vector è il One True Owner degli oggetti puntati, usa std::unique_ptr , potenzialmente con un deleter personalizzato per gestire la pulizia degli oggetti.

Come hai detto tu stesso, il vettore chiama i distruttori per i suoi elementi. Quindi, nel tuo esempio il vettore chiama “destructors of pointers”. Tuttavia, è necessario tenere presente che i tipi di puntatore non hanno distruttori. Solo i tipi di class possono avere distruttori. E i puntatori non sono classi. Quindi, è più corretto dire che std::vector applica la syntax della chiamata pseudo-distruttore agli oggetti puntatore memorizzati nel vettore. Per i tipi di puntatore che risultano in non-operazione, cioè non fa nulla.

Questo risponde anche alla seconda parte della tua domanda: se gli oggetti myclass puntati dai puntatori vengono distrutti. No, non vengono distrutti.

Inoltre, sembra che tu in qualche modo creda che “chiamare i distruttori sui puntatori” (la prima parte della tua domanda) sia la stessa cosa di “distruggere gli oggetti appuntiti” (la seconda parte della tua domanda). In realtà si tratta di due cose non correlate completamente diverse.

Per creare un collegamento dal primo al secondo, vale a dire fare in modo che il vettore distrugga gli oggetti appuntiti, devi build il tuo vettore da una sorta di “puntatori intelligenti”, in contrasto con i normali puntatori raw myclass * . Il vettore chiamerà automaticamente i distruttori dei “puntatori intelligenti” e questi distruttori, a loro volta, distruggeranno gli oggetti appuntiti. Questo “link” può essere implementato solo esplicitamente, all’interno del distruttore del “puntatore intelligente”, ed è per questo che i normali puntatori grezzi non possono aiutarti qui.

No; cosa succede se hai memorizzato un puntatore su un object automatico?

 vector v; T tinst; v.push_back(&tinst); 

Se il vettore chiama i distruttori degli oggetti puntati verso i puntatori, l’object automatico verrebbe distrutto due volte – una volta quando usciva dall’ambito e una volta quando il vettore non rientrava nel campo di applicazione. Inoltre, che cosa succede se non dovrebbero essere deallocati con l’ delete ? Non c’è modo di comportarsi in modo appropriato in ogni situazione.

Se i tuoi oggetti sono tutti allocati dynamicmente, devi iterare manualmente il vettore ed delete ogni puntatore se è stato allocato con un new . In alternativa, è ansible creare un vettore di puntatori intelligenti che rilasciano gli oggetti puntati dai puntatori:

 vector> v; v.push_back(new T);