Как выходить из программы (совет)

R

rrrFer

Не завершайте процесс и потоки с помощью соответствующих функций, включая функции стандартной библиотеки (например, функция exit). Пусть завершение происходит естественным образом, то есть выходом из соответствующей функции потока или функции main.

Дело в том, что компиляторы имеют полное право не уничтожать (не вызывать деструкторы) локальные объекты, живущие в том же пространстве, в котором вызывается функция завершения процесса или потока. Это нарушает работу идиомы владения. Например очередь сообщений может ожидать в деструкторе корректной отработки оставшихся сообщений. Если идиома владения будет нарушена, то вы потеряете не только ресурсы, но вполне возможно что и важные данные.

В качестве примера:
Код:
#include <iostream>

struct test
{
    ~test()
    {
        std::cout << "~test()" << std::endl;
    }
};

int main()
{
    test t;
    exit(1);
    return 0;
}

В этой программе деструктор не будет вызван, хотя объект создавался на стеке.

Также будьте предельно осторожны во время совместного использования идиомы владения и функций а-ля fork().
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!