c++ - std:: shared_ptr Exception Safety
c++11 memory-leaks (2)
template<class Y> explicit shared_ptr(Y* p);
[util.smartptr.shared.const] / 6 Emite :
bad_alloc
, o una excepción definida por la implementación cuando no se pudo obtener un recurso que no sea la memoria.
[util.smartptr.shared.const] / 7 Seguridad de excepción : si se lanza una excepción, se llamadelete p
.
Así que no, no hay pérdida de memoria.
Acabo de darme cuenta de que, al leer esta página, el constructor de std :: shared_ptr con un solo argumento de puntero no es una excepción.
Por lo tanto, el siguiente código contiene una posible pérdida de memoria:
std::shared_ptr<int> p3 (new int);
El razonamiento es que podrían ocurrir dos asignaciones:
- El primero antes de la llamada al constructor.
- El segundo en el constructor de shared_ptr (Esto es lo que sucede en VS 2012, por ejemplo)
Dos preguntas aquí:
¿Es cierto que si la segunda asignación lanza una excepción, la memoria de la primera se filtra?
Si la respuesta es sí:
¿Cuál es el idioma correcto para usar std :: shared_ptr?
- utilizando make_shared
- otorgando la propiedad de la primera asignación a un std :: unique_ptr y luego transfiriendo la propiedad
- Otros pensamientos ?
Respuesta tardía, pero es mejor usar make_shared()
para seguridad de excepción, como se describe en GotW # 102 : El siguiente código no es seguro de excepción:
f( std::shared_ptr<T1>{ new T1 }, std::shared_ptr<T2>{ new T2 } );
Considerando lo siguiente es:
f( std::make_shared<T1>(), std::make_shared<T2>() );