C++自动析构时的顺序问题
自动析构时是先析构后构造的.
//普通(非模板)类的成员模板 classDebugDelete{ public: DebugDelete(ostream&s=cerr):os(s){} templatevoidoperator()(T*p)const { os<<"deletingunique_ptr"< (int*)const unique_ptr p2(newint,DebugDelete()); //实例化DebugDelete::opeartor() (string*)const unique_ptr sp(newstring,DebugDelete()); }
这里输出
deletingunique_ptr double
deletingunique_ptr int
deletingunique_ptr classstd::basic_string,classstd::allocator >
deletingunique_ptr int
可以看到,主动析构的正常进行.
函数结束后自动析构的,先创建了int后创建了string,但是先析构了string
classB { public: virtual~B(){cout<<"deleteB"<输出
deleteD
deleteB
这里构造时是先构造基类,再构造派生类.但是在析构时是先析构了子类,再析构了基类。
知识点补充:C++构造与析构的执行顺序
1、代码如下:
classA { public: int_Id; A():_Id(0) { printf("A[%d]\n",_Id); } ~A() { printf("~A[%d]\n",_Id); } }; classB { public: A_A; A*_PA; B() { printf("B\n"); } ~B() { printf("~B\n"); delete_PA; } }; intmain(intargc,char*argv[]) { { Bb; b._PA=newA(); b._PA->_Id=17; } return0; }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++自动析构时的顺序内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!