首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请教,是不是自定义的所有的指针最后都要delete

2012-02-05 
请问,是不是自定义的所有的指针最后都要delete?请问,是不是自定义的所有的指针最后都要delete?有些时候,自

请问,是不是自定义的所有的指针最后都要delete?
请问,是不是自定义的所有的指针最后都要delete?

有些时候,自定义的指针指向的是个类或者COM,接口,我在析构函数中delete的时候,发生非法访问错误。我把delete那句删了就正常了,系统也没有出现内存泄露的警告,为什么呢?

[解决办法]
不是你new出来的,就不能delete
new和delete严格地1对1配对的。
[解决办法]
就是,delete针对对空间

你delete后将NULL赋给指针
[解决办法]
分清是在栈上分配的,还是在堆上分配的,new出来的就是在栈上分配,必须delete掉,同理malloc 也得与free配对使用。
[解决办法]
看是不是需要你自己维护的指针
栈空间分配的数据是不需要维护
或者别人已经维护了也不需要你操作
[解决办法]
有些时候,自定义的指针指向的是个类或者COM,接口,我在析构函数中delete的时候,发生非法访问错误。我把delete那句删了就正常了,系统也没有出现内存泄露的警告,为什么呢?

1.只有你自己用new关键字new出来的空间,才能用delete显式释放。
2.而且你释放的时候必须是原本的指针,如果你new出来的指针作为另外的函数的参数,在函数中发生了改变。你再delete就不行了。所以最好在函数中另外声明一个临时指针和你new指针指向相同地址,然后对这个临时指针进行操作。完了以后释放原来指针就行。
3.一个new只能对应一个delete
[解决办法]
请问,那COM中的CoCreateInstance , 算不算是在栈上分配的
--------------
应该是在堆中分配的。COM的释放是通过IUnknown接口的Release方法来进行的,当引用计数为0时,销毁自己。
[解决办法]
你所谓的 "自定义指针 "其意义不够准确,如果你是在堆栈上的自定义指针,例如:

//在栈上创建:
long _x = 10;
long _px = &_x;//这也是一个自定义指针!

_px及_x的生命期相同,对于_px而言显然不需delete。那么你指的是在堆上的自定义指针,则情况如后述。

对于C++而言, "delete "是堆空间的内存释放操作,通常如果你申请堆空间,例如:

long* _plong = new long;

则你必须在_plong指针变量的生命期结束前使用delete释放你曾申请的堆空间: 例如:

delete _plong;//要记住,这是一个C\C++程序员的责任!

根据你的具体问题,我不妨推测你使了VC并应用MFC(或类似的技术)以及COM技术编程。要明白的是:

对于MFC,有些类其自身内部有资源申请操作,例如CString以及CDC等等类。这些类有些要依靠自已的Delete成员函数,或类似ReleaseDC之类的外部函数去释放其申请的资源(包括堆内存以及句柄等等)。这些类如果你先未调用这些东东,就在堆上delete这些类的指针,则极有可能生成类似非法访问错误和资源泄漏的运行时错误,当然有些MFC类能在自已的析构函数中作上述清洁工作(这当然应归功于这些类的设计者是些合格的程序员),你可以直接使用delete(这是语言应有的特性)。总之情况复杂,作为VC程序员一定要知道上述细节。

对于COM,情况更有不同,很多COM组件及接口等的删除机制不同于C++类,一般而言这些东东的删除由COM服务器自身控制,指向COM的指针在你使用完毕后你需要调用它自已的Delete成员函数,但调用后有可能COM组件仍在内存中,而不能去删除一个指向COM的指针(这时候它已经退化成一个void*)。

   造成你的问题的原因是Microsoft的程序员很少是地道的C++程序员,所以在他们的代码中大量掺杂C语言程序员的习惯。

这就是你的问题的解!

热点排行