gpt4 book ai didi

c++ - 在 main 的 return 0 语句之后可以调用任何函数吗?

转载 作者:行者123 更新时间:2023-11-30 01:19:06 24 4
gpt4 key购买 nike

我认为这段代码的输出应该在第一个析构函数之后停止。因为析构函数在它们的大括号之后被调用。因此,因为前三个析构函数的右括号在 return 0 之后;语句,它们的析构函数是怎么调用的?

#include < iostream> 

using namespace std;

int val=0;

class abc
{

public :

abc()
{
cout<<++val;
}

~abc()
{
cout<<--val;
}

};

int main()
{
abc a1,a2,a3;
{
abc a4;
}
return 0;
}

输出:12343210

为什么不:12343

最佳答案

Because detructors are called after their enclosing braces.

不,自动对象的析构函数在程序离开它们的范围时被调用 - 无论是到达 block 的末尾,还是使用 returnbreakcontinuegotothrow(只要处理了异常)。

因此,RAII允许我们安全且轻松地管理动态资源 - 正如您的示例所示,通过自动销毁所有对象。如果不是这种情况,资源管理几乎是不可能的,没有人会尝试用 C++ 编写重要的程序。

注意事项:

  • 如果您通过调用函数(例如 std::exit)而不是从 main 返回来终止程序,则堆栈不会展开并且不会自动变量将被销毁。
  • 如果异常在它离开 main 之前没有被捕获,那么在程序终止之前堆栈是否被展开是不确定的。至少在一个流行的编译器上,它不会。
  • 使用 std::longjmp 离开一个非平凡的自动对象的范围会产生未定义的行为;在 C++ 中应避免使用 C 库函数,除非您正在做一些非常时髦的事情。

关于c++ - 在 main 的 return 0 语句之后可以调用任何函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21399062/

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