2012-08-12 12 views
8

Si entiendo correctamente, cuando se inicializa un shared_ptr (de boost, tr1, std, whatever) con un puntero a un objeto recién asignado, el constructor de shared_ptr asigna una pequeña cantidad de memoria para mantener un recuento de referencia para el puntero maneja. ¿Qué sucede si falla esa asignación? En el siguiente código:¿Qué sucede si falla el constructor de shared_ptr?

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; 
} 

... se filtrará el objeto my_class si el shared_ptr no puede asignar memoria para su cuenta de referencia? ¿O el constructor de shared_ptr asume la responsabilidad de eliminar el objeto?

Respuesta

7

Su código no filtrará el objeto my_class, incluso si shared_ptr no pudo asignar memoria.

De acuerdo con el estándar de C++ 11 (20.7.2.2.1), en el shared_ptr constructor:

Lanza: bad_alloc, o un fi nida excepción aplicación-de un recurso cuando no sea la memoria no podía Ser obtenido.

Seguridad de excepción: si se produce una excepción, se llama delete p.

En la versión del constructor que toma un eliminador definido por el usuario, se usará el eliminador en su lugar.

Boost documentation especifica lo mismo.

+0

Saludos. Inicié Google pero no encontré una respuesta. Uno de estos días aprenderé a verificar la fuente, es decir, el estándar. :-) – bythescruff

Cuestiones relacionadas