construcción de dos fases toma la siguiente forma:¿Los punteros inteligentes excluyen la necesidad de una construcción en dos fases?
struct something {
something()
: p1(NULL)
, p2(NULL)
{ }
~something() {
if (p1) delete p1;
if (p2) delete p2;
}
void initialize() {
p1 = new int(2);
p2 = new int(5); // May throw if allocation fails!
}
int* p1;
int* p2;
};
el punto de que es que un constructor ingenuo (que no reloj por errores de asignación) será pérdida de memoria: destructor de un objeto construido parcialmente nunca es llamado .
Mi pregunta: ¿es seguro el siguiente código, y por corrolario, los punteros inteligentes obvian la construcción de dos fases?
struct something {
something()
: p1(new int(2))
, p2(new int(5))
{ }
std::unique_ptr<int> p1;
std::unique_ptr<int> p2;
};
No es necesario un condicional antes de 'borrar'. En serio, no lo haces. Eliminar null está perfectamente bien. –
No hay lanzamiento nuevo y eliminar también que funcionan con la asignación de memoria al igual que malloc()/free(). Pero incluso si la asignación en sí misma no falla utilizando new/delete que no arroje, los constructores de objetos aún pueden lanzar. –
@KerrekSB tomado nota. :) –