gpt4 book ai didi

c++ - 破坏静态存储持续时间对象和未定义的行为

转载 作者:搜寻专家 更新时间:2023-10-31 01:39:54 26 4
gpt4 key购买 nike

C++ 标准第 3.6.1 节说

Calling the function std::exit(int) declared in <cstdlib> terminates the program without leaving the current block and hence without destroying any objects with automatic storage duration If std::exit is called to end a program during the destruction of an object with static storage duration, the program has undefined behavior.

所以,考虑下面的简单程序

#include <iostream>
#include <cstdlib>
class test
{
public:
test()
{
std::cout<<"constructor\n";
}
~test()
{
std::cout<<"destructor\n";
}
};
int main()
{
test t;
exit(0);
}

显然上面程序的输出应该是

constructor

所以,我的问题是:

  1. 自动对象t什么时候销毁?

  2. 它会被编译器安全销毁吗?

  3. 为什么是未定义的行为?

现在,考虑对上述程序稍加修改的版本。

#include <iostream>
#include <cstdlib>
class test
{
public:
test()
{
std::cout<<"constructor\n";
}
~test()
{
std::cout<<"destructor\n";
}
};
int main()
{
static test t;
exit(0);
}

现在,我得到了以下输出:

constructor

destructor

那么,是否有可能由于未定义的行为而在某些 C++ 实现中仅将构造函数调用视为输出?

如果我理解有误,请指正。

最佳答案

  1. when the automatic object t will be destroyed?

从来没有。您引用的引言是“......没有破坏任何具有自动存储持续时间的对象......”

  1. Will it be safely destroyed by compiler?

没有。编译器的工作是生成机器运行的代码,一旦你在运行时,编译器就不再做任何事情。

  1. Why it is undefined behavior?

在您的示例中,这不是未定义的行为 - 您不会“在销毁具有静态或线程存储持续时间的对象期间”调用 std::exit()。但是,如果您是,回答“这是未定义的行为,因为标准明确规定了这一点”就足够了。

关于c++ - 破坏静态存储持续时间对象和未定义的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30488692/

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