gpt4 book ai didi

c++ - C++ 中全局对象销毁和 atexit 之间的顺序

转载 作者:IT老高 更新时间:2023-10-28 22:28:24 24 4
gpt4 key购买 nike

我想知道在 C++ 中,全局对象的销毁和 atexit 之间可以确定顺序

我有一个全局对象并注册 atexit 函数,如下所示:

static MyClass g_class;

void onExit()
{
// do some destruction
}

int main()
{
atexit(onExit);

return 0;
}

我发现 onExit() 在 Visual Studio 2012 和 gcc4.7.2 中的 MyClass::~MyClass() 之前被调用。我确定总是在全局对象(如 g_class)销毁之前调用 onExit 吗?

我想知道全局对象寄存器顺序和 atexit 寄存器顺序使用相同的顺序表。还是全局对象顺序和atexit顺序没有关系?

已编辑:对不起,我写错了。我在整理示例代码时很困惑。 onExit() 在 ~MyClass() 之前调用。

最佳答案

更新: OP 造成了一些困惑,看起来 VC11 的行为确实符合 C++11 标准的规定。以下答案是在假设没有的情况下编写的。

因此,这个问题的答案:

Am I sure that onExit is always invoked before global object(like g_class) destruction?

"is",只要您使用的是完全兼容的编译器。


I've found MyClass::~MyClass() is invoked before onExit() in Visual Studio 2012.

如果是这种情况,那么它是 VC11 中的一个错误。根据 C++11 标准的第 3.6.3/1 段:

Destructors (12.4) for initialized objects (that is, objects whose lifetime (3.8) has begun) with static storage duration are called as a result of returning from main and as a result of calling std::exit (18.5). [...]

此外,根据第 3.6.3/3 段:

If the completion of the initialization of an object with static storage duration is sequenced before a call to std::atexit (see <cstdlib>, 18.5), the call to the function passed to std::atexit is sequenced before the call to the destructor for the object.

因此,就您而言,onexit()应该在 MyClass 的析构函数之前调用.

据我所知,Clang 3.2 和 GCC 4.8.0 在这方面是兼容的,如 live example 所示.

关于c++ - C++ 中全局对象销毁和 atexit 之间的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16010083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com