Ускоренное завершение программы
От: Sm0ke Россия ksi
Дата: 10.10.21 09:48
Оценка:
Некоторые программы долго закрываются. Почему бы не сделать им быстрый выход (в обход деструкторам)? А операционная система позаботится сама об освобождении динамической памяти и закрытии файлов, хендлов, и прочее. Однако некоторые необходимые действия при выходе из программы бывают нужны, такие как: сохранение настроек, записи инфы в лог, и т.д.

// 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(); который очищает вектор, вызывая деструкторы только нужных объектов и чао!
cpp
Re: Ускоренное завершение программы
От: Alexander G Украина  
Дата: 10.10.21 10:01
Оценка:
Здравствуйте, Sm0ke, Вы писали:

S>Некоторые программы долго закрываются. Почему бы не сделать им быстрый выход (в обход деструкторам)?


Для этого есть quick_exit / at_quick_exit с C++11, не?
https://en.cppreference.com/w/cpp/utility/program/quick_exit
Русский военный корабль идёт ко дну!
Re[2]: Ускоренное завершение программы
От: Sm0ke Россия ksi
Дата: 10.10.21 14:05
Оценка:
Здравствуйте, 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() функции.
Re: Ускоренное завершение программы
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.10.21 20:31
Оценка: +6
Здравствуйте, Sm0ke, Вы писали:

S>Некоторые программы долго закрываются. Почему бы не сделать им быстрый выход (в обход деструкторам)?


Это от кривых рук. Деструкторы здесь ни при чем.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.