Also haben wir einen Konstruktor, der abhängig von den übergebenen Argumenten eine Exception auslösen kann, aber wir wissen nicht, wie man das Objekt löscht, wenn dies passiert. Wichtiger Teil des Codes:Wie lösche Objekt, wenn Konstruktor eine Ausnahme auslöst?
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;
}
In der dritten Zeile GameBase::getGame()
ruft den Konstruktor für eines der Spiele, die von GameBase
und gibt einen Zeiger auf dieses Spiel, und diese Konstrukteure können Ausnahmen werfen. Die Frage ist, wie können wir dann das (partielle?) Objekt löschen, auf das gameptr
zeigt, wenn dies auftritt? Wenn eine Ausnahme ausgelöst wird, verlassen wir den Gültigkeitsbereich gameptr
, weil wir den try-Block verlassen und delete gameptr
nicht aufrufen können.
Wenn der Konstruktor löst, wird das Objekt nicht konstruiert. Überhaupt nicht, also müssen Sie es nicht "löschen". Sie müssen sich nur sorgen, wenn Sie bereits Ressourcen zugewiesen haben, bevor die Ausnahme ausgelöst wird: Der Destruktor wird nicht ausgeführt. –