【带头学C++】----- 九、类和对象 ---- 9.3 析构函数

9.3 析构函数

9.3.1 如何定义析构函数

       函数名和类名称相同,在函数名前加  ~ ,没有返回值类型,没有函数形参。 (不能被重载)

当对象生命周期结束的时候,系统自动调用析构函数(析构函数会先清理对象占用内存空间存放的内容,最后释放该对象的空间)

先调用析构函数,再释放对象的空间。

【带头学C++】----- 九、类和对象 ---- 9.3 析构函数_第1张图片

看下面这个顺序进行释放,{} 代表一个生命周期,或者说作用域。

对象在生命周期结束就会消亡。

消亡顺序:整体从上往下逐个构造,释放的时候出作用域最先消亡,从下往上开始释放。同级的同作用域的按照栈的顺序从下往上释放。

【带头学C++】----- 九、类和对象 ---- 9.3 析构函数_第2张图片

栈:先进后出,最早出现的进入栈底下,最后出现的进入到栈顶部,想象成井水。栈是一种存储的数结构,存储在里面的数据,按照这个顺序进行压栈弹栈。(后面会专门更一下常见数据结构,感兴趣的小伙伴,也可以去找一些视频观看。)

一般情况下,空的析构函数就足够。但是如果一个类有指针成员,这个类必须写析构函数,释放指针成员所指向空间。 

【带头学C++】----- 九、类和对象 ---- 9.3 析构函数_第3张图片

 内存泄漏问题是比较常见的问题,并且也是很严重的污染内存空间的行为,所以,使用指针,要记得释放,申请堆区空间要记得释放。

【带头学C++】----- 九、类和对象 ---- 9.3 析构函数_第4张图片

 【带头学C++】----- 九、类和对象 ---- 9.3 析构函数_第5张图片

 代码:


#include 
#include 

using namespace std;

class Data2{
public:
     char * name;
public:
    //无参构造函数
    Data2(){
        name = nullptr;
        cout << "无参构造函数" << endl;
    }

    //有参构造函数
    Data2(const char * str){
        name  = new char[strlen(str) + 1];
        strcpy_s(name, strlen(str) + 1, str);
        cout << "有参构造函数" << endl;
    }

    ~Data2(){
        //析构函数
        if(name != nullptr){
            delete [] name;
        }
         cout << "析构函数"<< endl;
    };
};
void test02(){
    Data2 da1("Hellow");
    cout<

你可能感兴趣的:(C++从基础到抗大旗,开发语言,链表,算法,数据结构,c++)