~May~ 发表于 5 天前

面向对象-析构函数

#include <iostream>

using namespace std;

// 析构函数:
//                是对象生命周期的终点,在对象空间被销毁之前调用
//                在析构函数中,一般进行资源的释放,堆内存的销毁
//                不能重载,一个类只能有一个析构函数。

class Person {
public:
        int age;
        int* p;
        // 析构函数:使用~开头,不能有参数
        ~Person()
        {
                cout << "Person类的析构函数调用了" << endl;
                // 在析构函数中,将类内其它引用的堆空间都释放掉,避免内存泄露
                if (p != nullptr)
                {
                        delete p;
                        p = nullptr;
                }
        }

};

int main() {
        //在堆上创建对象
        Person* xiaoming = new Person();
        xiaoming->p = new int(10);
        int* tmp = xiaoming->p;

        //释放堆空间
        delete xiaoming; // 手动分配的内存(如:new)需在析构函数中通过 delete 释放

        cout << *tmp << endl;

        system("pause");

        return 0;
}

FishC 发表于 5 天前

你提供的代码中存在一些问题,以下是经过修正和完整的析构函数例子:

带有析构函数的Person类示例


#include <iostream>

using namespace std;

class Person {
public:
    int age;
    int* p;

    // 构造函数
    Person(int a) {
      age = a;
      p = new int(a); // 动态分配内存
    }

    // 析构函数:使用~开头,不能有参数
    ~Person() {
      cout << "调用析构函数" << endl;
      delete p; // 释放动态分配的内存
    }
};

int main() {
    Person* xiaoming = new Person(25);
    cout << "xiaoming 的年龄是: " << xiaoming->age << endl;
    cout << "xiaoming 的动态分配的内存值是: " << *(xiaoming->p) << endl;
   
    // 释放对象
    delete xiaoming; // 析构函数将在这里被调用

    return 0;
}


如果有更多问题或需要进一步解释,请随时提出!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 面向对象-析构函数