¿Es posible escribir un puntero inteligente que asigne el objeto en sí mismo en su constructor, en lugar de que el desarrollador tenga que llamar al new
? En otras palabras, en lugar de escribir:¿Por qué un puntero inteligente no puede llamar a new() para mí en su constructor?
std::unique_ptr<myClass> my_ptr(new myClass(arg1, arg2))
... uno podría escribir:
std::smarter_ptr<myClass> my_ptr(arg1, arg2)
Es la sintaxis del lenguaje capaz de expresar esto? ¿Sería esto deseable? ¿Horrible? Estoy pensando en particular en la protección contra este error (que me he hecho a mí mismo, por supuesto):
myFunction(std::unique_ptr<myClass>(new myClass()), std::unique_ptr<myClass>(new myClass()))
... que corre el riesgo fugas que sea objeto se asigna en primer lugar si la segunda asignación pasa y lanza antes de que el primer objeto esté instalado de forma segura en su puntero inteligente. Pero, ¿un puntero más inteligente realmente lo haría seguro?
@Joe: Es una preocupación; es muy posible que el código generado ejecute las dos expresiones 'nuevas' antes de usar cualquiera de los resultados para inicializar un puntero inteligente; en cuyo caso obtendrá una fuga si la segunda arroja. –
@Joe: Estás equivocado. 'tmp1 = new myClass(); tmp2 = new myClass(); arg1 = std :: unique_ptr (tmp1); arg2 = std :: unique_ptr (tmp2); myFunction (arg1, arg2); 'es un orden de ejecución perfectamente legal. –
Bastante, estaba sondeando para probar que soy incorrecto. Gracias. – Joe