Sto lavorando con std::shared_ptr
e durante lo sviluppo del mio software ho incontrato un paio di di casi che mi lasciano dubbi sulla gestione della memoria. Avevo una libreria di terze parti che mi dava sempre dei puntatori grezzi dalle funzioni e nel mio codice li stavo trasformando in std::shared_ptr
(da std e non da boost. A proposito, qual è la differenza tra i due? ?). Quindi cerchiamo di dire che ho il seguente codice:C++ pointer raw e std :: shared_ptr
ClassA* raw = new ClassA;
std::shared_ptr<ClassA> shared(raw);
Cosa succede ora quando il puntatore condiviso va fuori del campo di applicazione (diciamo è stato dichiarato a livello locale in una funzione e ora sto uscendo la funzione). L'oggetto ClassA
esiste ancora perché punta un puntatore raw ?
Solo per dare una ragione per cui: shared_ptr non considera il puntatore raw perché non c'è modo che shared_ptr possa saperlo. Se pensate a come implementare una shared_ptr da soli, vedrete che non potete rilevare se ci sono dei puntatori grezzi ai dati. – Wutz
+1. Inoltre, questo è il motivo per cui dovresti 'new' l'oggetto sulla stessa riga quando crei' shared_ptr'. Ancora meglio, usa ['make_shared'] (http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared) –
Grazie, in effetti sono d'accordo che non c'è modo di scoprire se un puntatore raw è indicando l'oggetto. In questo caso è pericoloso per il puntatore raw perché punta a un oggetto distrutto perché il parametro shared_ptr lo distruggerà quando è fuori portata – ISTB