Как уже говорили другие, «решение» - это лучшее разделение интересов.
В вашем случае, почему переменная задачи не может позаботиться об очистке после себя?
Если необходимо выполнить какую-либо очистку, то это должен быть не указатель, а объект RAII.
void foo() {
// Task* task;
ScopedTask task; // Some type which internally stores a Task*, but also contains a destructor for RAII cleanup
while (task = nextTask()) {
task->status = running;
// ...code that might throw an exception...
}
}
В этом случае вам могут понадобиться умные указатели (boost :: shared_ptr по умолчанию удалит указатель, но вместо этого вы можете указать пользовательские функции удаления, которые вместо этого могут выполнять произвольную очистку. Для RAII для указателей это обычно ты захочешь.
Проблема не в отсутствии ключевого слова finally, а в том, что вы используете необработанные указатели, которые не могут реализовать RAII.
Но обычно каждый тип должен знать, как убирать за собой. Не после каждого объекта, находящегося в области действия, когда было сгенерировано исключение (что, в конце концов, делает и что вы пытались сделать), только после самого себя. И если каждый объект делает это, то вам вообще не нужна большая универсальная функция «очистки после каждого объекта в области видимости».