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