9. 析构函数

在 C++ 语言中,每个对象都有自己的生命周期,在释放对象自己占用的内存前一定会调用析构函数来释放该对象占用的资源。

析构函数 (Destructor)

析构函数会在对象销毁前自动调用。如果类内没有定义析构函数,则编译器也会为其添加一个析构函数,默认的析构函数什么都不做。

析构函数的作用是释放对象对象使用的资源。

析构函数的语法

class 类名{
    public:
    ~类名(void) {
        ... 做释放内存或关闭文件等操作
    }
}

说明

一般一个类内的成员变量有指针,则需要虚构函数类释放动态分配的内存资源。

示例

实现一个 Person 类用于描述人的信息。由于人的名字有长有短,因此采用动态分配内存的方式来保存人名信息。其中人的名字使用成员变量 pname 来保存。此示例中如果没有添加析构函数,则 pname 指向的内存不会释放,内存会有丢失。

// filename: destructor.cpp
#include <iostream>
#include <string.h>

using namespace std;

class Person {
    public:
        Person(const char * name, int a):age(a)  {
            if (NULL == name) { // 分配一个字节存放尾零
                pname = (char*)malloc(1);
                *pname = '\0';
            } else {
                pname = (char*)malloc(strlen(name)+1);
                strcpy(pname, name);
            }
            cout << "构造函数被调用" << endl; 
        }
        ~Person(void) {
            // 释放内存
            free(pname);
            cout << "析构函数被调用" << endl; 
        }
    public:
        void printInfo() {
            cout << pname << "今年" << age << "岁\n";

        }
    private:
        char * pname; // 姓名
        int age; // 年龄
};

int main(int argc, char * argv[]) {
    Person p1("wei", 35);  // 调用无参的构造函数
    p1.printInfo();

    return 0;
}

编译和运行结果如下:

weimz@mzstudio:~$ g++ -o destructor destructor.cpp
.weimz@mzstudio:~$ ./destructor 
构造函数被调用
wei今年35岁
析构函数被调用

练习:

尝试使用编写析构函数,尝试使用析构函数的语法。