我们按照正常的思路,来探讨一下这个问题。
首先是定义一个类,这里就不说明了。
然后是创建类的对象(实例化一个类),一般有两种方法:常规创建的方法和动态创建的方法。见代码事例:
// 定义类
class A
{
public:
~A();
};
A::~A()
{
cout<<"析构"<<endl;
}
void main()
{
A a; // 常规创建的方法
A *p = new A; // 动态创建的方法
}
何时析构?
(1)常规创建的方法就像我们创建一个内部类型的变量一样。常规创建的对象像普通变量一样有它自己的作用域,当常规创建的对象超出作用域时,会自动运行该对象的析构函数。
(2)动态创建的对象,只有我们主观的去删除指向动态对象的指针时,才会运行该对象的析构函数。我们知道指针也是一个变量,它也有自己的作用域,当指向动态对象的指针超出自己的作用域时,动态对象是不会运行析构函数的,这也就造成了“内存泄漏”。
变量的作用域其实就是我们能在代码段里能够使用该变量的地方,当超出该变量的作用域,也就不能再使用该变量了。动态创建的对象的作用域,其实是委托给了指向该对象的指针,即该指针的作用域和动态对象的作用域是一体的,当指针丢失时,动态对象也就无法再使用了。这里可能不太好理解,我下面举一个例子。
定义类A和类B
// 定义类A
class A
{
public:
~A();
};
A::~A()
{
cout<<"析构A"<<endl;
}
// 定义类B
class B
{
public:
~B();
};
B::~B()
{
cout<<"析构B"<<endl;
}
主函数
// 主函数
void main()
{
A* p = NULL;
{
p = new A;
B a;
}
}