析构函数调用
Destructor calling
我是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之上。因此,一旦函数结束,它将首先被破坏。我们调用析构函数来破坏内存分配。更多
附加资源:类似问题
相关文章:
- 什么时候调用析构函数
- C++-明确何时以及如何调用析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- C++ 防止在映射中放置()时调用析构函数
- 调用析构函数以释放动态分配的内存
- C++:使用方法调用析构函数的顺序是什么?
- 向量推回调用析构函数时调用析构函数
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++,我应该调用析构函数吗?
- 如何获取有关在 Clang LibTooling 中调用析构函数的信息?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 未调用的初始化静态thread_local结构的构造函数和析构函数
- 为什么这里不调用析构函数
- 在调用 std::bind 的产品后意外调用析构函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 如何在C++中调用析构函数
- 为什么为未删除的对象调用析构函数?
- 调用析构函数时出错
- C++ 在不释放内存的情况下调用析构函数
- 从函数调用析构函数返回的对象