2013-05-22 4 views
5

Ich arbeite an Code von jemand anderem, dass viele Aussagen wie dieseauto_ptr, sofort get() und release() - ist es nützlich?

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

Ist dies sogar nützlich enthält? Gibt es einen praktischen Grund, einen intelligenten Zeiger zu verwenden hier statt nur

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

'std :: auto_ptr' ist nützlich. Es ist einfach nicht so brauchbar. –

+0

Was passiert, wenn 'object_list' beim Neuaufbau auslöst? Außerdem ist 'std :: auto_ptr' C++ 03, also habe ich das C++ 11-Tag entfernt. – Xeo

Antwort

13
objects_list.push_back(new ObjectA(this)); 

Dies kann zu Speicherverlust führen. Mal sehen, was passiert, wenn wir es brechen:

  • new ObjectA(this)
  • push_back zugeordnet heißt dann

jedoch push_back werfen kann und wenn ja, Ihr new ObjectA ist durchgesickert.

Der Code auto_ptr, den Sie uns zeigten, löst dieses Problem: wenn push_back wirft, dann ist der Zeiger immer noch im Besitz von auto_ptr und kein Leck passiert.


Die wirkliche Lösung wäre Smart-Pointer direkt statt nackter Zeiger in dem Behälter zu speichern (weil nackte Zeiger in Containern Kopfschmerzen, wenn es um die Gewährleistung der Objekte kommt richtig gelöscht werden).

Leider mit C++ 03 (wo auto_ptr herkommt, ist es in C++ 11 veraltet) ist es nicht möglich, auto_ptr in Containern zu speichern (das Muster ist stark beschädigt). Man könnte boost::shared_ptr in Containern speichern oder zu C++ 11 wechseln und entweder unique_ptr oder shared_ptr speichern.

2

Schreiben Die Idee war wahrscheinlich gegen Speicherlecks push_back wirft der Vektor der in Fall zu schützen. Dies kann passieren, wenn die Vektoren verschoben werden müssen und nicht mehr Speicher zugewiesen werden kann.

+0

Oder wenn copy/move ctors der Objekte werfen. – Xeo

+2

Xeo: Wenn eine Kopie oder Verschiebung eines Pointer-Wertes wirft Sie sowieso geschraubt –

+0

Wer sagt, dass 'object_list' tatsächlich Zeiger speichert? Vielleicht speichert es etwas, das implizit aus "ObjectA *" konstruierbar ist? :) – Xeo

1

Es stellt Ausnahme Sicherheit. Im ersten Beispiel wird das zugeordnete Objekt gelöscht, wenn push_back fehlschlägt; Im zweiten Beispiel wird es undicht.

Beachten Sie, dass seit 2011 auto_ptr zugunsten unique_ptr veraltet ist. Dies hat den Vorteil, dass es im Vektor gespeichert werden kann, so dass Sie die Objekte beim Entfernen aus dem Vektor nicht manuell löschen müssen.