c++ c++11 memory-leaks shared-ptr

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 llama delete 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>() );