• c++ -- 析构函数


    1、析构函数形式:
    ~类名()
    {
    
    }
    无参数,无返回值,故不能被重载,只能有一个
    2、作用:释放类对象占用的资源(不能释放动态分配的资源 如用 new 申请的资源)
    
    当一个变量超出自己的作用域时占用的资源会被释放,同样,动态分配的资源在此时是不被释放的
    必须手动的释放,否则会造成内存泄露
    如:
    string *p ;
    {
    string *q = new string("hello")
    p = q ;
    }//在这里当遇到右花括号,会释放他所在块申请的资源,但动态分配的无法释放
    cout<<*p<<endl ; 
    输出结果为:hello
    
    同样析构函数也无法释放对象中动态申请的资源
    如
    
     1 class node
     2 {
     3     public:
     4 
     5     int a,b;
     6     node()
     7     {
     8        *p = "hello" ;
     9         a = 0 ;
    10         b = 0 ;
    11     }
    12     ~node()
    13     {
    14         cout<<"this is destruct
    " ;
    15         //delete p ;
    16     }
    17 
    18 };
    19 
    20 int main()
    21 {
    22     string *q ; 
    23     
    24    {
    25       node a ; 
    26       q = a.p ;
    27    }
    28    
    29    cout<<"q is "<<*q<<endl ; 
    30 
    31 }
    输出结果:hello
    
    但是如果加上delete,就会出错了。
    
    3、合成析构函数:
    无论我们自己是否为类编写析构函数,编译器都会合成一个析构函数,用于释放
    资源,而我们的自己的析构函数只是在释放对象是做些想做的操作(书上这么说的
    虽然我感觉不是这样,当然可以理解为只有我们自己的析构函数执行操作并释放资源
    ),所以释放对象的时候先执行我们自己的析构函数,再执行合成的析构函数。
    
    4.析构函数撤销对象的顺序:
    无论是类对象之间,还是类对象内部的数据成员,析构函数都是按照声明顺序的逆序
    释放资源
    */
    

      

  • 相关阅读:
    LOJ-10096(强连通+bfs)
    LOJ-10095(缩点的特殊使用)
    LOJ-10094(强连通分量)
    LOJ-10092(最大半连通子图)
    【BZOJ3489】A simple rmq problem(KD-Tree)
    UVA10384 推门游戏 The Wall Pushers(IDA*)
    [SCOI2005]骑士精神(IDA*)
    浅谈A*算法
    【模板】K-D Tree
    【XSY1953】【BZOJ4012】【HNOI2015】开店(动态点分治)
  • 原文地址:https://www.cnblogs.com/acSzz/p/4562928.html
Copyright © 2020-2023  润新知