R
rrrFer
Не завершайте процесс и потоки с помощью соответствующих функций, включая функции стандартной библиотеки (например, функция exit). Пусть завершение происходит естественным образом, то есть выходом из соответствующей функции потока или функции main.
Дело в том, что компиляторы имеют полное право не уничтожать (не вызывать деструкторы) локальные объекты, живущие в том же пространстве, в котором вызывается функция завершения процесса или потока. Это нарушает работу идиомы владения. Например очередь сообщений может ожидать в деструкторе корректной отработки оставшихся сообщений. Если идиома владения будет нарушена, то вы потеряете не только ресурсы, но вполне возможно что и важные данные.
В качестве примера:
В этой программе деструктор не будет вызван, хотя объект создавался на стеке.
Также будьте предельно осторожны во время совместного использования идиомы владения и функций а-ля fork().
Дело в том, что компиляторы имеют полное право не уничтожать (не вызывать деструкторы) локальные объекты, живущие в том же пространстве, в котором вызывается функция завершения процесса или потока. Это нарушает работу идиомы владения. Например очередь сообщений может ожидать в деструкторе корректной отработки оставшихся сообщений. Если идиома владения будет нарушена, то вы потеряете не только ресурсы, но вполне возможно что и важные данные.
В качестве примера:
Код:
#include <iostream>
struct test
{
~test()
{
std::cout << "~test()" << std::endl;
}
};
int main()
{
test t;
exit(1);
return 0;
}
В этой программе деструктор не будет вызван, хотя объект создавался на стеке.
Также будьте предельно осторожны во время совместного использования идиомы владения и функций а-ля fork().