栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++自动析构时的顺序问题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++自动析构时的顺序问题

自动析构时是先析构后构造的.

//普通(非模板)类的成员模板
class DebugDelete{
public:
 DebugDelete(ostream &s = cerr) :os(s){}
 template void operator()(T*p)const
 {
 os << "deleting unique_ptr " <(int*)const
 unique_ptrp2(new int, DebugDelete());
 //实例化DebugDelete::opeartor()(string*)const
 unique_ptrsp(new string, DebugDelete());
}

这里输出

deleting unique_ptr  double
deleting unique_ptr  int
deleting unique_ptr  class std::basic_string,class std::allocator >
deleting unique_ptr  int

可以看到,主动析构的正常进行.

函数结束后自动析构的,先创建了int后创建了string,但是先析构了string

class B
{
public:
 virtual ~B(){ cout << "delete B" << endl; }
};
class D :B
{
public:
 virtual ~D() override{ cout << "delete D" << endl; }
};
void demo_delete()
{
 D d;
}

输出

delete D

delete B

这里构造时是先构造基类,再构造派生类.但是在析构时是先析构了子类,再析构了基类。

知识点补充:C++ 构造与析构的执行顺序

1、代码如下:

class A
{
public:
 int _Id; 
 A():_Id(0)
 {
 printf("A[%d]n",_Id);
 }

~A()
 {
 printf("~A[%d]n",_Id);
 }
};

class B
{
public:
 A _A;
 A* _PA;
 B()
 {
 printf("Bn");
 }
 ~B()
 {
 printf("~Bn");
 delete _PA;
 }
};

int main(int argc, char* argv[])
{
 {
 B b;
 b._PA = new A();
 b._PA->_Id = 17;
 }

 return 0;
}

2、执行顺序

A[0]
B
A[0]
~B
~A[17]
~A[0]

3、B是栈上对象,C++保证栈上对象离开作用域,会自动调用析构方法。

4、考虑b中的对象,_A是栈上对象,_PA是指针,堆上对象,对于_PA必须delete,否则资源泄露。而对于_A不需要处理,会自动调用析构方法。可以这样理解,对象b离开作用域,调用析构方法,而b中的_A当然也离开了作用域(皮之不存毛将存焉),调用析构方法。

5、碰到过这样的情况,vs自动生成的析构方法有问题,导致崩溃。手动添加一个析构方法,就可以了。

总结

到此这篇关于C++自动析构时的顺序的文章就介绍到这了,更多相关C++自动析构时的顺序内容请搜索考高分网以前的文章或继续浏览下面的相关文章希望大家以后多多支持考高分网!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/61854.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号