析构函数
1、基本介绍
-
析构函数是对象销毁时自动调用的特殊成员函数,用于释放资源
-
析构函数名称为
~【类名】,无参数,无返回值 -
一个类只有一个析构函数,不写则编译器生成空析构函数
-
析构函数不要手动调用(能调用,但别这样做,会导致重复析构)
-
反向顺序自动析构成员变量
2、演示
cpp
#include <iostream>
using namespace std;
class MyTest {
public:
~MyTest() {
cout << "释放资源" << endl;
}
};
int main() {
{
MyTest mytest;
}
cout << "已离开作用域" << endl;
return 0;
}
# 输出结果
释放资源
已离开作用域
cpp
#include <iostream>
using namespace std;
class StringBuffer {
private:
char* data;
size_t size;
public:
StringBuffer(const char* str) {
size = strlen(str);
data = new char[size + 1];
strcpy(data, str);
cout << "构造: " << data << endl;
}
~StringBuffer() {
cout << "析构: " << data << endl;
delete[] data; // 释放堆内存
}
void print() {
cout << "内容: " << data << endl;
}
};
int main() {
{
StringBuffer sb("Hello World");
sb.print();
}
cout << "已离开作用域" << endl;
return 0;
}
# 输出结果
构造: Hello World
内容: Hello World
析构: Hello World
已离开作用域
3、补充学习
- 析构函数不要手动调用
cpp
#include <iostream>
using namespace std;
class MyTest {
public:
~MyTest() {
cout << "释放资源" << endl;
}
};
int main() {
{
MyTest mytest;
mytest.~MyTest();
}
cout << "已离开作用域" << endl;
return 0;
}
# 输出结果
释放资源
释放资源
已离开作用域
- 反向顺序自动析构成员变量
cpp
#include <iostream>
using namespace std;
class Member {
string name;
public:
Member(const char* n) : name(n) {
cout << "成员构造: " << name << endl;
}
~Member() {
cout << "成员析构: " << name << endl;
}
};
class Container {
Member m1, m2;
public:
Container() : m2("m2"), m1("m1") {
cout << "容器构造" << endl;
}
};
int main() {
Container c;
return 0;
}
# 输出结果
成员构造: m1
成员构造: m2
容器构造
成员析构: m2
成员析构: m1