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;
}