析构函数调用

Destructor calling

本文关键字:函数调用 析构      更新时间:2023-10-16

我是C++的新手,目前正在学习它。
当我探索web和问题时,我在下一个代码中遇到了问题:

class A
{
public:
~A() { cout << "A"; }
};
class B
{
public:
~B() { cout << "B"; }
};

int main()
{
A a;
B b;
return 0;
}

的输出如下:

BA

有人能解释为什么输出是这样的吗?

清理其他答案中的神话:不,清理顺序与堆栈无关。

C++标准甚至没有定义堆栈的概念,除非在两种情况下:

  • 堆栈展开(作为一个过程(
  • 堆栈容器适配器

这两者都不相关。相关的是第6.6节:

从作用域退出时(无论完成多少(,对象在该范围内构建的存储持续时间为按与其构造顺序相反的顺序销毁了

传出循环、传出块或返回到初始化的具有自动存储持续时间的变量包括在该点范围内具有自动存储持续时间的对象从转移但不在转移到的点。

大多数体系结构都使用执行堆栈来实现这种行为,这是一个"令人高兴的巧合",但这并不是标准强制要求的。

另一方面,无论实现是否使用堆栈,都可以保证的反向顺序销毁。

对象的销毁顺序与创建顺序相反。

如果函数中的对象是使用new关键字创建的,则会在堆中分配内存。动态存储器

如果函数中的对象不是使用new关键字创建的,则在堆栈中为其分配内存(尽管c++没有强制要求使用堆栈(。

int main( )
{
A a;
B b;
} 

在上述情况下,B位于A之上。因此,一旦函数结束,它将首先被破坏。我们调用析构函数来破坏内存分配。更多

附加资源:类似问题