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

  

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

     //普通(非模板)类的成员模板   类DebugDelete {   公众:   DebugDelete(上ostream和s=cerr):操作系统(s) {}   模板& lt; typename T>空白符()(T * p)常量   {   操作系统& lt; & lt;“删除unique_ptr”& lt; & lt;类型id (T) . name () & lt; & lt; endl;   删除p;   }   私人:   上ostream和操作系统;   };   空白demo_general_class_tempalte_member ()   {   双* p=新双;   DebugDelete d;   d (p);//d调用DebugDelet::操作符()(双*),释放p   int * ip=new int;//在一个临时DebugDelete对象上调用操作符()(int *)   DebugDelete () (ip);//实例化DebugDelete: opeartor () & lt; int> (int *)常量   unique_ptr p2 (int, DebugDelete ());//实例化DebugDelete: opeartor () & lt; string> *)(字符串常量   unique_ptr<字符串,DebugDelete> sp(新字符串,DebugDelete ());   }      

这里输出

  
  

删除unique_ptr,双
  删除unique_ptr, int
  删除unique_ptr,类std:: basic_string类std:: allocator
  删除unique_ptr, int

     

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

  

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

        B类   {   公众:   虚拟~ B () {cout & lt; & lt;“删除B & lt; & lt;endl;}   };   B类D:   {   公众:   虚拟~ D()覆盖{cout & lt; & lt;“删除D”& lt; & lt;endl;}   };   空白demo_delete ()   {   D D;   }      

输出   

  

删除D

  

删除B

     

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

  

  

1,代码如下:
  

        A类   {   公众:   int _Id;   ():_Id (0)   {   printf (" % d \ n”, _Id);   }      ~ ()   {   printf (" ~ % d \ n”, _Id);   }   };      B类   {   公众:   _A;   * _PA;   B ()   {   printf (" B \ n”);   }   ~ B ()   {   printf (" ~ B \ n”);   删除_PA;   }   };      int主要(int命令行参数个数,char * argv [])   {   {   B B;   b。_PA=new ();   b._PA→_Id=17;   }      返回0;   }      

  
  

[0]
  B
  一个[0]
  ~ B
  ~一个[17]
  ~一个[0]
  

     

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

  

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

  

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

  

  

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

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