[Corrección:] No lo es. Una excepción en su constructor no perderá recursos porque el único lugar donde podría ocurrir una excepción es dentro de la expresión new
, y si falla una expresión new
, se liberan los recursos asignados por ella. Su situación es especial porque solo realiza una única asignación en el constructor; en general, esto no es seguro.
Su frase citada se refiere a es el operador de eliminación para el objeto cuyo constructor no arrojó:
struct T
{
T() { throw 1; }
char data[200];
};
// in your code:
T * pt = new T;
En la última línea, se asigna memoria antes de que se invoca el constructor. Esa memoria se libera en caso de una excepción, mediante una llamada automática al ::operator delete(pt)
. (En general, el juego delete-operador (no "expresión") acorde con la nueva expresión se llama!).
Dice así:
en cuenta que sólo tenemos un objeto después de ha completado el constructor - por lo que en caso de una excepción en el constructor, que ni siquiera tienen un objeto. Es por eso que dije "fall-object" arriba con un guión, porque no es un objeto en absoluto (como el abeto Douglas no es un abeto en absoluto).
su código es potencialmente inseguro por completo fugas , si va a realizar más de una asignación que podría lanzar - es decir, una fuga ocurre cuando un objeto se ha construido con éxito pero otro, uno de fallar. Probablemente debería simplemente no llamar new
en la lista de inicialización y en lugar de ponerlo en el cuerpo:
class Danger
{
T * pt1, * pt2;
public:
Danger()
{
try { pt1 = new T; } catch(...) { throw(); }
try { pt2 = new T; } catch(...) { delete pt1; throw(); }
}
};
O, por el principio de la responsabilidad individual, no utilizar punteros primas, pero la gestión de contenedores uso de los recursos que limpiar después de ¡¡sí mismos!!
Hace que se pregunte qué tan bien funcionan las implementaciones: si el constructor para 'v_ [5]' arrojó, entonces 'eliminaría v _ []' solo destruiría 'v_ [0]' a través de 'v_ [4]', y saltaría las no construido? –
@Mike: los que no están construidos no necesitan ser destruidos (nunca fueron creados); ¿qué estás diciendo que es el problema? – ildjarn
Me pregunto si va y los destruye de todos modos. (Es decir, ¿pierde la pista de cuántos construyó con éxito?) Ahora que lo pienso, me pregunto si garantiza la destrucción en el orden inverso de la construcción ... –