У меня есть небольшой фрагмент:
Action* newAction(Agent& a, ACTION_MODE& m)
{
Action *new_action;
do
{
new_action = new Action(a,m);
}
while (!state->addAction(new_action));
return new_action;
}
state->addAction(Action *a);
вернет true, если * a было добавлено, false, если * a не добавлено (проверяет, существует ли * a уже).
Теперь я знаю, что goto считаются злыми для многих людей, поэтому в приведенном выше фрагменте перераспределение new_action в каждом цикле без его удаления не так ли?Разве следующий фрагмент не будет более «разумным»?
retry :
Action *new_action = new Action(a,m);
if (state->addAction(new_action))
{
return new_action;
}
else
{
delete new_action;
goto retry;
}
Извините, если это кажется элементарным, но это то, о чем я уже давно задумался.Что правильно, удалить память и затем перераспределить, или я могу перераспределить мгновенно?
РЕДАКТИРОВАТЬ:
Это было бы лучше?
Action* newAction(Agent& a, ACTION_MODE& m)
{
// state will only allow an action to be added if it does not already exist
Action *new_action = new Action(a,m);
if (!new_action) return 0;
while (!state->addAction(new_action))
{
delete new_action;
new_action = new Action(a,m);
}
return new_action;
}
Вызывающий эту функцию ожидает новое действие, которое уже было добавлено в состояние, поэтому удаление должно происходить здесь.