我需要知道编译器如何在cpp中使用析构函数
i need to know how compiler work with destructors in cpp
假设我有两个不同的类。
为什么当我把类A
对象作为数据成员放在类B
中时,首先被销毁的类是类B
,然后是类A,但当我把A
对象放在类B
的生成器中时,然后是A
,然后是类别B
?例如:
class A {
public:
~A() { std::cout << "Deleting An"; }
};
class B {
private:
A object;
public:
~B() { std::cout << "Deleting Bn"; }
};
int main( void ) {
B test;
return 0;
}
结果:
删除B
删除
但下一个例子给了我相反的结果:
class A {
public:
~A() { std::cout << "Deleting An"; }
};
class B {
public:
B() { A object; }
~B() { std::cout << "Deleting Bn"; }
};
int main( void ) {
B test;
return 0;
}
结果:
删除A
删除B
在第二个例子中,B test;
调用B.的构造函数
构造函数B只是一个函数,它有一个局部变量A object;
。这个对象被创建,并且在作用域的末尾(B的构造函数的末尾(它被取消作用域。
在main的末尾返回main,对象test
被销毁。
因此,在这种情况下,对象A object;
首先被破坏,随后对象B test;
被破坏。
在你的第一个例子中,这是不同的。A object;
是类B的成员,因此B的构造函数自动构造该成员。构造的顺序是:首先是基类(在您的示例中不存在(,然后是成员,然后是构造函数的主体。销毁的顺序相反:首先是销毁函数的主体,然后是成员(包括您的A object;
(,然后是基类(在您的示例中不存在(。
正如在评论中所说,您可以轻松地在调试器中逐步执行代码,以更好地了解执行顺序。
因为类A的对象在类B的构造函数完成后立即销毁(因为它是函数中的局部变量(,并且它在调用类B析构函数之前。
在第二个例子中,您的构造函数中有对象(A类实例(,local。当您现在在主函数中实例化B时,构造函数会被调用,创建对象,并在构造函数完成后销毁它。在第一个示例中,对象是类成员,在主函数中的寿命与类对象的寿命一样长。当程序完成时,它会调用costumDestructor,然后首先执行,然后销毁所有成员(标准构造函数(。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 当指针在 cpp 17 中失去引用时,是否会调用非默认析构函数?
- 如何调试Cpp程序中的析构函数
- cpp 中的析构函数是否自动调用?即使析构函数没有提及非动态变量,它们也会被删除吗?
- 当在头文件上而不是在CPP文件上实现时,析构函数会导致内存泄漏——仅在linux上实现
- cpp文件中的内联构造函数和析构函数
- 如何理解CPP中的调用析构函数方法
- 为什么类的析构函数"inlined"在仅包含类的头文件的 cpp 中