读书人

关于析构函数解决方案

发布时间: 2012-02-06 15:52:44 作者: rapoo

关于析构函数
#include <iostream>
using namespace std;
class Point
{
public:
Point():x(0),y(0){}
~Point(){cout < < "sdkfj ";}
private:

int x;
int y;

};

int main()
{
Point pt;
pt.~Point();
system( "pause ");
}

程序输出:

sdkfj请按任意键继续. . .
sdkfj

这证明调用了再次析构函数,一次是我调用 的,一次是程序自己调用的
可我调用析构函数,不是已经销毁了这个对象了吗,咋会又调用析构函数呢?


[解决办法]
汗,您看书恐怕太不仔细了。
栈对象所占(栈)空间在对象结束生命期时,自动退栈释放。
堆对象所占(堆)空间,由operator delete/delete[]函数释放。
delete/delete[] operator由2部分组成:先调析构函数,再调operator delete/delete[]函数
[解决办法]
char*c=new char[34];
Point *e=new (c) Point;
e-> ~Point();
delete c;
===========================
这段代码正好说明,析构函数不释放内存。否则就不会delete c了。
注意,如果delete e,则会将对象析构两遍,引发未定义的错误。
不要反着思考问题。首先,这段代码是对的。于是,它表明析构函数不负责释放内存。然后,就接受“析构函数不释放内存”这个事实。最后,可以获得推论,必然有什么东西负责释放内存。再去查阅资料,寻找这个“什么东西”。
如果一开始就认定析构函数负责释放内存,那么自然想不通这些问题了。

读书人网 >C++

热点推荐