Пожалуйста помоги:
Я знаю о деструкторах и 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;
}
Вызов деструкторов не о 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;
}
Других решений пока нет …