RaymondHuang
RaymondHuang
发布于 2022-12-17 / 78 阅读
0
0

类的析构函数

普通的析构函数非常简单,在类名前加上一个波浪号~即可,程序结束时会默认调用:

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就变成了野指针,输出没有意义的数。



评论