2012-08-12 20 views
8

Se ho capito bene, quando un shared_ptr (da boost, tr1, std, qualunque) viene inizializzato con un puntatore a un oggetto appena assegnato, il costruttore di shared_ptr alloca una piccola quantità di memoria per contenere un conteggio di riferimenti per il puntatore gestisce. Cosa succede se quell'allocazione fallisce? Nel codice seguente:Cosa succede se un costruttore di shared_ptr non riesce?

class my_class {}; 
void my_func(shared_ptr<my_class> arg); 

int main(int argc, char* argv[]) 
{ 
    my_func(shared_ptr<my_class>(new my_class())); 
    return 0; 
} 

... sarà l'oggetto my_class trapelato se lo shared_ptr non riesce ad allocare memoria per il conteggio dei riferimenti? Oppure il costruttore di shared_ptr si assume la responsabilità dell'eliminazione dell'oggetto?

risposta

7

Il codice non perderà l'oggetto my_class, anche se shared_ptr non è in grado di allocare memoria.

Secondo lo standard C++ 11 (20.7.2.2.1), nel costruttore shared_ptr:

Produce: bad_alloc, o un fi nito un'eccezione implementazione-de quando una risorsa diversa memoria non poteva essere ottenuto.

Eccezione sicurezza: se viene generata un'eccezione, viene chiamato delete p.

Nella versione del costruttore che accetta un deleter definito dall'utente, verrà utilizzato il deleter.

Boost documentation specifica lo stesso.

+0

Cheers. Ho acceso Google ma non ho trovato una risposta. Uno di questi giorni imparerò a controllare la fonte, cioè lo standard. :-) – bythescruff

Problemi correlati