普通的析构函数非常简单,在类名前加上一个波浪号~即可,程序结束时会默认调用:
class Student {
public:
int id;
Student() {
id = 0; // id在栈空间被创建,默认析构的时候,该变量也会被删除
cout << "Student()" << endl;
}
~Student() { // 析构函数
cout << "~Student()" << endl;
}
};
但如果放在函数体中,作返回值,就要注意,假设有这么一个类:
class Teacher {
public:
int* age;
Teacher() {
age = new int(0); // age在堆空间被创建,故默认析构的时候,该变量不会被删除
cout << "Teacher()" << endl;
}
~Teacher() {
// delete age; // 需要写上这一句话,age才会被从堆空间删除!
cout << "~Teacher()" << endl;
}
};
然后,有这么一个函数:
int* test() {
Teacher t = Teacher();
return t.age;
}
在主函数里,这样书写:
int *age = test();
cout << *age << endl;
如果析构函数内没有删除堆空间内的age,则输出必然是0,因为指针一直指向的是堆空间的age,但如果在析构函数内加上了delete age这句话,那么堆空间的age就会被删除,那主函数的age就变成了野指针,输出没有意义的数。