objects_list.push_back(new ObjectA(this));
Może to spowodować wyciek pamięci. Zobaczmy, co się dzieje, gdy rozbicie go:
new ObjectA(this)
przeznaczono
push_back
wtedy nazywa
Jednak push_back
można wyrzucić, a jeśli tak, to twój new ObjectA
wyciekły.
Kod, który nam pokazałeś rozwiązuje ten problem: jeśli push_back
rzuca, to wskaźnik nadal jest własnością auto_ptr
i nie ma wycieku.
Prawdziwym rozwiązaniem byłoby przechowywać inteligentne kursory bezpośrednio w pojemniku zamiast nagich wskaźników (bo nagich wskaźniki w pojemnikach są bóle głowy, jeśli chodzi o zapewnienie obiekty zostały prawidłowo usunięte).
Niestety z C++ 03 (skąd pochodzi auto_ptr
, został wycofany w C++ 11), nie można przechowywać auto_ptr
w pojemnikach (wzór jest poważnie uszkodzony). Można przechowywać boost::shared_ptr
w pojemnikach lub przełączyć na C++ 11 i przechowywać albo unique_ptr
lub shared_ptr
.
'std :: auto_ptr' jest przydatne. Po prostu nie nadaje się do użytku. –
Co zrobić, jeśli 'object_list' wyrzuca podczas ponownego wzrostu? Ponadto, 'std :: auto_ptr' to C++ 03, więc usunąłem tag C++ 11. – Xeo