当我们使用atexit()

时间:2016-02-07 03:29:53

标签: c++ destructor atexit

请帮助: 我知道destructors和atexit()并且知道以下内容: atexit()注册一个在程序终止时调用的函数(例如,当main()调用return或者在某处显式调用exit()时)。

当调用exit()时,会破坏静态对象(调用析构函数),但不会破坏局部变量作用域中的对象,当然也不会动态分配对象(只有在显式调用delete时才会销毁这些对象)。

下面的代码给出输出为: atexit处理程序 静态dtor

你能帮我理解为什么当我们使用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;
    }

1 个答案:

答案 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,你也看过

&#34; Stack未展开:不调用具有自动存储持续时间的变量的析构函数。&#34;

您问题的答案是什么?#34;为什么&#34;?在某些情况下,特别是未恢复的错误您可能会使用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;
}