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 ?
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 llamadelete p
.
Así que no, no hay pérdida de memoria.
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>() );
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