Некоторые программы долго закрываются. Почему бы не сделать им быстрый выход (в обход деструкторам)? А операционная система позаботится сама об освобождении динамической памяти и закрытии файлов, хендлов, и прочее. Однако некоторые необходимые действия при выходе из программы бывают нужны, такие как: сохранение настроек, записи инфы в лог, и т.д.
// done_fast.h
#include <cstdlib>
#include <vector>
#include <memory>
struct done_base {
virtual ~done_base() = default;
};
struct done_fast {
// types
using t_items = std::vector< std::unique_ptr<done_base> >;
// data
t_items items_;
// actions
void done(bool is_good = true) {
items_.clear(); // только нужные деструкторы
std::_Exit(is_good ? EXIT_SUCCESS : EXIT_FAILURE); // выход в обход прочих деструкторов
}
// static
static done_fast & instance() {
static done_fast inst;
return inst;
}
protected:
done_fast() = default;
};
Теперь обработчики выхода наследуем от класса done_base, помещаем действия в деструкторе и добавляем в список через: done_fast::instance().items_.emplace_back(). А для выхода из программы вызываем: done_fast::instance().done(); который очищает вектор, вызывая деструкторы только нужных объектов и чао!
Здравствуйте, Sm0ke, Вы писали:
S>Некоторые программы долго закрываются. Почему бы не сделать им быстрый выход (в обход деструкторам)?
Для этого есть quick_exit / at_quick_exit с C++11, не?
https://en.cppreference.com/w/cpp/utility/program/quick_exit
Здравствуйте, Alexander G, Вы писали:
AG>Здравствуйте, Sm0ke, Вы писали:
S>>Некоторые программы долго закрываются. Почему бы не сделать им быстрый выход (в обход деструкторам)?
AG>Для этого есть quick_exit / at_quick_exit с C++11, не?
AG>https://en.cppreference.com/w/cpp/utility/program/quick_exit
Да, но обработчики at_quick_exit не будут вызваны, если не вызвать quick_exit() (скажем забыли, или выпало исключение, или ещё что).
А обработчики done_fast будут вызваны в этом случае, даже если не вызвать done(). Кроме того наследники класса done_base могут хранить свойства, параметры завершения. Это может быть удобнее, чем просто void() функции.