objects_list.push_back(new ObjectA(this));
Questo può perdere memoria. Vediamo cosa succede quando noi spezziamo giù:
new ObjectA(this)
è assegnato
push_back
viene poi chiamato
Tuttavia, push_back
può lanciare e se lo fa, il tuo new ObjectA
è trapelato.
Il codice auto_ptr
che ci hai mostrato risolve questo problema: se push_back
gira, il puntatore è ancora di proprietà di auto_ptr
e non si verificano perdite.
La vera soluzione sarebbe quella di memorizzare puntatori intelligenti direttamente nel contenitore invece di puntatori nude (perché puntatori nude in contenitori sono mal di testa quando si tratta di garantire gli oggetti siano correttamente cancellato).
Sfortunatamente con C++ 03 (da cui deriva auto_ptr
, è stato deprecato in C++ 11) non è possibile memorizzare auto_ptr
in contenitori (il motivo è gravemente danneggiato). È possibile memorizzare boost::shared_ptr
in contenitori o passare a C++ 11 e memorizzare unique_ptr
o shared_ptr
.
'std :: auto_ptr' è utile. Non è così utilizzabile. –
Cosa succede se 'object_list' lancia quando ricresce? Inoltre, 'std :: auto_ptr' è C++ 03, quindi ho rimosso il tag C++ 11. – Xeo