Деструктор не вызывается для локальных объектов, когда мы используем atexit ()

Пожалуйста помоги:
Я знаю о деструкторах и atexit () и знаю следующее:
atexit () регистрирует функцию, вызываемую при завершении программы (например, когда main () вызывает return или когда где-то явно вызывается exit ()).

Когда вызывается exit (), статические объекты уничтожаются (вызывается деструктор), но не объекты в области локальных переменных и, конечно, динамически размещаемые объекты (они уничтожаются только в том случае, если вы явно вызываете delete).

код ниже выдает результат в виде:
обработчик atexit
Статический дтор

Не могли бы вы мне помочь, зная, почему деструктор локальных объектов не будет вызываться при использовании atexit () ?.

Заранее спасибо:

class Static {
public:
~Static()
{
std::cout << "Static dtor\n";
}
};
class Sample {
public:
~Sample()
{
std::cout << "Sample dtor\n";
}
};

class Local {
public:
~Local()
{
std::cout << "Local dtor\n";
}
};

Static static_variable; // dtor of this object *will* be called
void atexit_handler()
{
std::cout << "atexit handler\n";
}
int main()
{
Local local_variable;
const int result = std::atexit(atexit_handler);
Sample static_variable; // dtor of this object *will not* be called
std::exit(EXIT_SUCCESS);//succesful exit
return 0;
}

2

Решение

Вызов деструкторов не о atexitно exit,

Я вообще не рассматриваю std::exit любое хорошее программирование на C ++. На самом деле, это и std::atexit

extern "C"   int atexit( void (*func)() ); // in <cstdlib>

приходят из стандартной библиотеки C. Что касается вашего примера, я думаю, что вы видели http://en.cppreference.com/w/cpp/utility/program/exit, и вы также видели

«Стек не разматывается: деструкторы переменных с автоматической продолжительностью хранения не вызываются».

Какой ответ на ваш вопрос «почему»? Есть несколько случаев, особенно невосстановленные ошибки вы могли бы использовать exit, но обычно использование должно придерживаться использования исключений, например,

Static static_variable;

int mainactual()
{
Local local_variable;
Sample static_variable;
throw std::exception("EXIT_FAILURE"); // MS specific
// ... more code
}
int main()
{
try
{
mainactual()
}catch ( std::exception & e )
{
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]