La función make_shared()
de Boost promete ser a prueba de excepciones al intentar crear un shared_ptr
.¿Por qué boost no tiene un make_scoped()?
¿Por qué no hay make_scoped()
equivalente? ¿Hay una mejor práctica común?
Aquí está un ejemplo de código de la boost::scoped_ptr
documentation que parece inseguro para mí:
boost::scoped_ptr<Shoe> x(new Shoe);
Esta línea de código va a hacer estas tres cosas con el fin:
- asignar memoria del montón por
Shoe
- Llamar al constructor para
Shoe
- llamar al constructor para
boost::scoped_ptr<Shoe>
Si el constructor de Shoe
lanza una excepción, se filtró
memoria.
(vea la respuesta de R. Martinho Fernandes) El scoped_ptr
no manejará la desasignación porque aún no se ha construido.
¿Esto es un descuido? ¿O hay una solución que no he notado?
Este ejemplo es seguro, pero uno que no es: 'f (boost :: scoped_ptr (nuevo Shoe), g());'. La práctica de codificación para resolver el problema: siempre nombre punteros inteligentes como variables o miembros, no los construya como subexpresiones temporales. –
aschepler