类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。在以下称三种情况下会调用类的析构函数。
1:对象生命周期结束,被销毁时。
2:主动调用delete 。
3:对象i是对象o的成员,o的析构函数被调用时,对象i的析构函数也被调用。
在第二种情况下,如果是new的对象,必须主动析构掉,否则,类的指针在离开作用域以后被析构掉但是其开辟的空间还没有被被回收会造成内存泄漏。例如:
class Person
{
public:
Person(){}
private:
Person(const Person& p);
Person& operator=(const Person& p);
};
Person::Person(const Person& p)
{
}
void fun()
{
Person* p1=new Person();
}
int main()
{
fun();
return 0;
}
fun函数在调用p1指针以后如果不主动delete,则其指向的内存会得不到释放,造成内存泄漏。
在类中,析构过程是逆序析构的,也就是先销毁子类对象,再销毁父类对象。如果有多重继承,按照继承的顺序,从右到左析构,例如下面的代码
class Person
{
public:
Person(){}
~Person()
{
cout<<"销毁Person"<<endl;
}
};
class Food
{
public:
Food(int type = 10)
{
m_type = 10;
}
Food(Food &other) //拷贝构造函数
{
m_type = other.m_type;
}
Food & operator =(Food &other) //重载赋值=函数
{
m_type = other.m_type;
return *this;
}
~Food()
{
cout<<"销毁food"<<endl;
}
private:
int m_type;
};
class A1
{
public:
A1(){}
~A1()
{
cout<<"销毁A"<<endl;
}
};
class Worker:Food,Person,A1
{
public:
Worker(){}
~Worker()
{
cout<<"销毁Worker"<<endl;
}
};
代码执行的结果是
销毁Worker
销毁A
销毁Person
销毁food
需要将基类的析构函数设置成虚函数,不要把不被继承的类的析构函数设置成虚函数。当派生类对象经由一个基类指针被删除,而该基类带有一个non-virtual析构函数,结果未定义——实际执行时通常发生的是对象的derived成分没有销毁,即“局部销毁”,造成资源泄露(因为存在这个问题,所以不要继承一个不被用作基类的类),当派生类对象经由一个基类指针被删除,而该基类带有一个non-virtual析构函数,结果未定义——实际执行时通常发生的是对象的derived成分没有销毁,即“局部销毁”,造成资源泄露(因为存在这个问题,所以不要继承一个不被用作基类的类)。