Предлагаю свою реализацию так и не вошедшей в новый стандарт конструкции finally. В boost есть аналог Boost.ScopeExit, но он более многословен, хотя работает и со старым стандартом C++.
Пример использования:
C++ (Qt)
{
std::cout << "Init" << std::endl;
FINALLY { std::cout << "Finalize" << std::endl; };
std::cout << "Work1" << std::end;
throw "BANG!";
std::cout << "Work2" << std::end;
}
Вывод:
Init
Work1
FinalizeТакже финализацию можно отменить по ходу исполнения:
C++ (Qt)
int openFile(const char* fn)
{
int fd = ::open(fn);
NAMED_FINALLY(fin1) { ::close(fd); }; // file will be closed if any error occurred
if (!checkFileSignature(fd))
throw std::runtime_error("File corrupted"); // file checking error
fin1.cancel(); // cancel file closing and return descriptor
return fd;
}
UPD 25.08.2014 Исправлена ошибка многократного срабатывания функтора освобождения, проявляющаяся на компиляторах MSVC в отладке, когда отключена оптимизация возврата объекта по значению.