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

目录

9.3 析构函数

9.3.1 如何定义析构函数

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

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


9.3 析构函数

9.3.1 如何定义析构函数

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

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

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

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

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

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

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

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

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

 

 代码:


#include <string.h>
#include <iostream>

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<<da1.name<<endl;
}
int main()
{
    test02();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小白Erike.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值