我是C ++的新手,目前正在学习它。
在探索网络和问题时,我遇到了下一个代码:
class A
{
public:
~A() { cout << "A"; }
};
class B
{
public:
~B() { cout << "B"; }
};
int main()
{
A a;
B b;
return 0;
}
输出如下:
BA
有人可以解释为什么输出看起来像这样吗?
答案 0 :(得分:6)
清除其他答案中的神话:不,清除顺序与堆栈无关。
除了两种情况外,C ++标准甚至没有定义堆栈的概念:
在这里都不相关。与相关的是第6.6节:
从范围退出(但已完成)时,具有自动对象 在该范围内构造的存储期限为 破坏了以与建造相反的顺序。
传送出循环,块外或返回经过初始化的 具有自动存储期限的变量会破坏 具有自动存储持续时间的对象在当前范围内 转移但不是转移到该点。
大多数体系结构使用执行堆栈来实现此行为的事实是“快乐的巧合”,但这不是标准强制要求的。
另一方面,无论实现是否使用堆栈,都可以保证逆向销毁。
答案 1 :(得分:3)
对象按照创建时的相反顺序销毁。
答案 2 :(得分:0)
如果使用new关键字创建了函数中的对象,则会在堆中为其分配内存。Dynamic Memory
如果函数中的对象不是使用new关键字创建的,则它们会在堆栈中分配内存(尽管c ++并不要求使用堆栈)。
int main( )
{
A a;
B b;
}
在上述情况下,B在A的顶部。因此,一旦函数结束,它将首先被销毁。我们调用析构函数销毁内存分配。 more
其他资源:similar question