2013-05-22 16 views
5

pracuję nad kodem cudzym, który zawiera wiele stwierdzeń jak toauto_ptr, natychmiastowy get() i release() - czy jest przydatny?

std::auto_ptr<ObjectA> smartptr(new ObjectA(this)); 
objects_list.push_back(smartptr.get()); 
smartptr.release(); 

Czy to jeszcze przydać? Czy jest jakiś praktyczny powód do korzystania z inteligentnych wskaźnik tutaj zamiast tylko pisanie

objects_list.push_back(new ObjectA(this)); 
+0

'std :: auto_ptr' jest przydatne. Po prostu nie nadaje się do użytku. –

+0

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

Odpowiedz

13
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.

2

Chodziło prawdopodobnie w celu ochrony przed wyciekami pamięci w przypadku rzuca VECTOR push_back. Może się to zdarzyć, jeśli wektory muszą zostać przeniesione i nie mogą przydzielić więcej pamięci.

+0

Lub jeśli osoby, które kopiują/przesuwają obiekty, rzucają. – Xeo

+2

Xeo: Jeśli kopia lub ruch wartości wskaźnika wyskakuje i tak jest przykręcony –

+0

Kto powiedział, że 'lista_obiektu' faktycznie przechowuje wskaźniki? Może przechowuje coś, co jest niejawnie możliwe do skonstruowania z 'ObjectA *'? :) – Xeo

1

Zapewnia bezpieczeństwo wyjątku. W pierwszym przykładzie przydzielony obiekt zostanie usunięty, jeśli push_back ulegnie awarii; w drugim przykładzie wycieknie.

Należy pamiętać, że od 2011 roku auto_ptr jest przestarzałe na rzecz unique_ptr. Ma to tę zaletę, że może być przechowywany w wektorze, uwalniając cię od ręcznego usuwania obiektów podczas usuwania ich z wektora.

Powiązane problemy