Was passiert, wenn der Konstruktor eines shared_ptr fehlschlägt?

8

Wenn ich richtig verstehe, wenn ein shared_ptr (von boost, tr1, std, was auch immer) mit einem Zeiger auf ein frisch zugewiesenes Objekt initialisiert wird, weist der Konstruktor von shared_ptr eine kleine Menge an Speicher zu, um eine Referenzzählung für den Zeiger zu halten es schafft es. Was passiert, wenn diese Zuweisung fehlschlägt? Im folgenden Code:

%Vor%

... wird das my_class -Objekt durchgesickert, wenn shared_ptr Speicher für seine Referenzzählung nicht zuordnen kann? Oder übernimmt der Konstruktor von shared_ptr die Verantwortung für das Löschen des Objekts?

    
bythescruff 12.08.2012, 12:41
quelle

1 Antwort

7

Ihr Code wird das Objekt my_class nicht verlieren, selbst wenn shared_ptr keinen Speicher zuordnen konnte.

Gemäß dem C ++ 11 Standard (20.7.2.2.1), im shared_ptr Konstruktor:

  

Wird ausgelöst: bad_alloc oder eine implementierungsdefinierte Ausnahme bei einer anderen Ressource als dem Speicher   konnte nicht erhalten werden.

     

Ausnahmesicherheit: Wenn eine Ausnahme ausgelöst wird, wird delete p aufgerufen.

In der Konstruktorversion, die einen benutzerdefinierten Deleter verwendet, wird stattdessen der Deleter verwendet.

Boost-Dokumentation gibt dasselbe an.

    
interjay 12.08.2012, 12:47
quelle