std:: seguridad de Excepción de RPP compartida


Acabo de darme cuenta leyendo esta página que el constructor de std::shared_ptr con un solo argumento puntero no es noexcept.

Por lo tanto, el siguiente código contiene una posible fuga de memoria:

std::shared_ptr<int> p3 (new int);

La razón es que dos asignaciones podrían ocurrir:

  • 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 arroja una excepción, la memoria de la primera se filtra ?

Si la respuesta es afirmativa:

¿Cuál es el idioma correcto para usar std:: shared_ptr?

  • usando make_shared
  • dando la propiedad de la primera asignación a un std::unique_ptr luego transfiriendo la propiedad
  • Otros pensamientos ?
Author: R. Martinho Fernandes, 2013-11-18

2 answers

template<class Y> explicit shared_ptr(Y* p);

[util.smartptr.compartir.const]/6 Tiros: bad_alloc, o una excepción definida por la implementación cuando no se pudo obtener un recurso que no fuera memoria.
[util.smartptr.compartir.const]/7 Exception safety: Si se lanza una excepción, se llama delete p.

Así que no, no hay pérdida de memoria.

 28
Author: Igor Tandetnik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-07 08:04:45

Respuesta tardía, pero es mejor usar make_shared() para la seguridad de excepción, como se describe en GotW # 102 : El siguiente código es no salvo excepciones:

 f( std::shared_ptr<T1>{ new T1 }, std::shared_ptr<T2>{ new T2 } );

Considerando lo siguiente:

f( std::make_shared<T1>(), std::make_shared<T2>() );
 11
Author: Thomas McGuire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-16 18:45:21