所以我们有一个构造函数,根据传递给它的参数可能会抛出异常,但我们不知道如何在这种情况下删除对象。 代码的重要部分:
try
{
GameBase *gameptr = GameBase::getGame(argc, argv);
if (gameptr == 0)
{
std::cout << "Correct usage: " << argv[PROGRAM_NAME] << " " << "TicTacToe" << std::endl;
return NO_GAME;
}
else
{
gameptr->play();
}
delete gameptr;
}
catch (error e)
{
if (e == INVALID_DIMENSION)
{
std::cout << "Win condition is larger than the length of the board." << std::endl;
return e;
}
}
catch (...)
{
std::cout << "An exception was caught (probably bad_alloc from new operator)" << std::endl;
return GENERIC_ERROR;
}
在第三行中,
GameBase::getGame()
调用了一个由GameBase
派生出来的游戏的构造函数,并返回指向该游戏的指针,这些构造函数可能会抛出异常。问题是,如果发生这种情况,我们如何删除gameptr
所指向的(部分?)对象?如果抛出异常,我们将退出gameptr
的作用域,因为我们离开了try块,无法调用delete gameptr
。
delete
它。唯一需要担心的是如果在抛出异常之前已经分配了资源:析构函数将不会运行。 - smiling_nameless