C++中类的默认成员函数之一:析构函数

目录

1.析构函数的作用

2.析构函数的特征

3.建议


1.析构函数的作用

        当对象的生命周期结束后,销毁对象中开辟的资源,而不是实现对象本身的销毁,局部的对象本身的销毁是由编译器完成的。


2.析构函数的特征

形式上:无参数无返回值   类名前加个~ 作为析构函数的名称 与构造函数作为区分   当对象的生命周期结束后自动调用  只能有一个 无法重载

typedef int DataType;
class Stack
{
public:
    Stack(size_t capacity = 3)
    {
        _array = (DataType*)malloc(sizeof(DataType) * capacity);
        if (nullptr == _array)
        {
            perror("malloc申请空间失败!!!");
            return;
        }
        _capacity = capacity;
        _size = 0;
    }
    void Push(DataType data)
    {
        // CheckCapacity(); 
        _array[_size] = data;
        _size++;
    }
    // 其他方法...
    ~Stack()//Stack在堆上申请了空间 析构函数要实现对额外申请的资源的释放
    {
        if (_array)
        {
            free(_array);
            _array = nullptr;
            _capacity = 0;
            _size = 0;
        }
    }
private:
    DataType* _array;
    int _capacity;
    int _size;
};
void TestStack()
{
    Stack s;
    s.Push(1);
    s.Push(2);
}

这个是Stack的析构函数,目的是释放Stack申请堆中的动态资源,避免造成内存泄漏~

class Time
{
public:
    ~Time()
    {
        cout << "~Time()" << endl;
    }
private:int _hour;
       int _minute;
       int _second;
};
class Date
{
private:
    // 基本类型(内置类型)
    int _year = 1970;
    int _month = 1;
    int _day = 1;
    // 自定义类型 
    Time _t;
};
int main()
{
    Date d;
    return 0;
}

没有显式写析构函数,系统会默认生成 不会对内置类型的成员变量进行处理 如果有自定义类型的成员变量会对调用自定义类型的析构函数,保证自定义类型的销毁


3.建议

如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值