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