c++ - 当我们使用 atexit() 时,不会为本地对象调用析构函数

标签 c++ destructor atexit

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

当调用 exit() 时,静态对象将被销毁(调用析构函数),但不会销毁局部变量范围内的对象,当然也不会销毁动态分配的对象(只有在显式调用删除时才会销毁这些对象)。

下面的代码给出的输出为: 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;
}

关于c++ - 当我们使用 atexit() 时,不会为本地对象调用析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35249384/

相关文章:

PHP5,析构函数中的异常

c++ - 用于单例销毁的 atexit : failure case

用于保存多种数据类型的 C# Arraylist 的 C++ 等效项

c++ - 找不到过程入口点

c++ - 为什么 C++ 析构函数会发生这种情况?

c++ - 从全局对象的构造函数调用时的 std::atexit 排序

libc - 什么时候应该使用atexit()?

c++ - 传递 &arr(整个 block 的地址)或仅传递数组名称(第一个元素的地址)有什么区别吗?

c++ - boost pool_alloc

c - 当我使用 GNU nm 时,它不显示 __DTOR_LIST__