三、C++ 析构函数

C++ 析构函数

一、基本概念

  1. 成员函数的一种
  2. 名字与类名相同
  3. 在前面加 ‘~’
  4. 没有参数和返回值
  5. 一个类最多只有一个析构函数

对象消亡时自动被调用,作用是在对象消亡前做善后工作,比如释放分配的空间等。
定义类时没写析构函数, 则编译器生成缺省析构函数,缺省析构函数不涉及释放用户申请的内存释放等清理工作

二、被调用的时机

2.1 程序结束时

class Ctest {
    public:
        ~Ctest() { cout<< "destructor called" << endl; }
};

int main () {
    Ctest array[2];
    cout << "End Main" << endl;

    return 0;
}

输出:

End Main
destructor called
destructor called

2.2 对象被delete时

pTest = new Ctest[3]; //构造函数调用3次
delete [] pTest; //析构函数调用3次

三、析构函数和构造函数

class Demo {
    int id;
    public:
        Demo( int i )
        {
            id = i;
            cout << “id=” << id << “ Constructed” << endl;
        } 

        ~Demo()
        {
            cout << “id=” << id << “ Destructed” << endl;
        }
};

Demo d1(1);

void Func(){
    static Demo d2(2);
    Demo d3(3);
    cout << "Func" << endl;
}

int main (){
    Demo d4(4);
    d4 = 6;
    cout << “main” << endl;
    { Demo d5(5); }
    Func();
    cout << “main ends” << endl;

    return 0;
}

输出:

id=1 Constructed
id=4 Constructed
id=6 Constructed //生成临时变量
id=6 Destructed //临时变量被释放
main
id=5 Constructed
id=5 Destructed //离开作用域
id=2 Constructed
id=3 Constructed
Func
id=3 Destructed
main ends
id=6 Destructed //d4,局部变量
id=2 Destructed //d2,静态变量
id=1 Destructed //d1,全局变量

在这个例子中,d4=6这条语句会生成一个临时对象,所以程序会马上调用它的构造函数和析构函数。打印main ends之后,还有d4(6)、d2、d1没被释放掉,它们分别是main函数的局部变量、静态变量、全局变量,依次调用析构函数。

四、小结

  1. 析构函数在对象消亡(程序结束、被delete)时被调用,目的是完成一些善后工作(比如释放分配给该对象的内存空间)
  2. 析构函数没有参数和返回值,函数前加符号“~”,一个程序最多只能有一个析构函数

你可能感兴趣的:(C++,delete,析构函数)