zoukankan      html  css  js  c++  java
  • 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.析构函数撤销对象的顺序:
    无论是类对象之间,还是类对象内部的数据成员,析构函数都是按照声明顺序的逆序
    释放资源
    */
    

      

  • 相关阅读:
    约瑟夫环公式解
    闭区间筛素数个数
    欧拉函数
    负进制转换
    2018黑龙江省赛总结
    基础博弈——威佐夫与尼姆不得不说的那些事
    极角排序
    int型素数拆分
    快速幂与费马小定理与组合数
    A*搜索算法
  • 原文地址:https://www.cnblogs.com/acSzz/p/4562928.html
Copyright © 2011-2022 走看看