关于调用析构函数的有关问题

关于调用析构函数的问题

析构函数不是自动会把分给对象的空间毁掉吗?
为什么有时候要显示地把一些成员变量的内存释放掉?
可以显示地把对象的空间毁掉吗?

------解决方案--------------------
对于栈对象,在作用域结束时析构函数会被自动调用。
对于堆对象(new出来的),必须显式释放(delete)它的时候才能引起它的析构函数被调用。
------解决方案--------------------
一个错误的观念是:
认为析构函数释放分给对象的空间.甚至一些教C++的书也持这种观念.

class A
{
int _a;
double _b;
public:
~A();
};
比如象这个类,
无论是 A a;
还是 A* pa=new A;delete pa;
所调用 的析构函数都没有释放空间的功能.
也就是为这种类写一个析构函数纯粹多余(做为基类的虚析构除外,但那也是空函数).

第一个,栈上的空间是系统管理的,析构函数帮不上忙.这个应该没有异议.
第二个,虽然在堆上分配空间.但释放堆上这个对象的空间也不是析构函数的功劳.如果不明白,请看析构函数真正的作用.

析构函数真正的作用处理对象所 "系挂的资源 ",最常见的就是里面有个指针,指向动态的堆内存.
class B
{
A* p;
public:
B(){p=new A;}
~B(){delete p;}
};

B* pb=new B;//栈上一个指针pb指向堆上B的对象.
delete pb;//此时,第一步,调用~B(),即释放堆上对象中指针p指向的内存(堆上对象A所占的内存).
//第二步,释放堆上B的对象.
//最后,pb在作用域结束处,其本身所占用的内存(栈内存)由操作系统回收管理.