Jak rzucamy wyjątek w konstruktorze, to wiadomo taki obiekt nie jest tworzony w związku z czym destruktor się nie wywoła.
Czy zatem dobra praktyka (jak już ktoś używa wyjątków w konstruktorze, bo też w sumie można przenieść implementację do innej metody i ją wywołać w głównej pętli programu), to czy zatem dobra praktyka polega na stworzeniu metody np. "release()" i wywoływaniu jej w destruktorze jak i po złapaniu wyjątku? Przykład niżej.
Goalnet::Goalnet(D3DXVECTOR3 pos, float angle)
{
try
{
if(Model::loadMesh(mapping::goalnet_path, mGoalnet) == NOK)
throw runtime_error("Goalnet::Goalnet() - goalnet mesh not created");
addToNetMeshVertexIndices();
if(Model::loadMesh(mapping::net_path, mNet) == NOK)
throw runtime_error("Goalnet::Goalnet() - net mesh not created");
mGoalnet.pos = new D3DXVECTOR3;
*mGoalnet.pos = pos;
D3DXMatrixRotationY(&mMatOrientation, angle);
mMatOrientation._41 = pos.x;
mMatOrientation._42 = pos.y;
mMatOrientation._43 = pos.z;
prepareInternalBlockData();
}
catch(const runtime_error &e)
{
release();
throw e;
}
catch(const bad_alloc& e)
{
release();
throw runtime_error("Goalnet::Goalnet error code " + string(e.what()));
}
}
Goalnet::~Goalnet()
{
release();
}
void Goalnet::release()
{
mGoalnet.release();
mNet.release();
}