1.为什么要使用delete this,以及如何使用。
(1)考查这样的情况:
有两个对象A,B需要访问同一个多态对象C。
因为C一般是通过new 操作构造的,一定要自己释放,但是对象A,B都需要使用它,并且B不知道A什么时候使用完成C,A也不知道B什么时候使用完成C(当然可以用函数通信的方法通知了,不过是一个比较丑陋的实现方法),所以不能在A/B中间来delete,
一个折中的办法是在程序退出的时候来delete,但是这样做不到资源的立即释放,假如有多个A/B/C会有比较大的运行开销。
解决的办法就是在C中增加引用计数,并且自己决定什么时候来释放自己:
下面是代码
struct c{
1.为什么要使用delete this,以及如何使用。 (1)考查这样的情况: 有两个对象A,B需要访问同一个多态对象C。 因为C一般是通过new 操作构造的,一定要自己释放,但是对象A,B都需要使用它,并且B不知道A什么时候使用完成C,A也不知道B什么时候使用完成C(当然可以用函数通信的方法通知了,不过是一个比较丑陋的实现方法),所以不能在A/B中间来delete, 一个折中的办法是在程序退出的时候来delete,但是这样做不到资源的立即释放,假如有多个A/B/C会有比较大的运行开销。 解决的办法就是在C中增加引用计数,并且自己决定什么时候来释放自己: 下面是代码 struct c{ C(){nRef=1;}; int AddRef(){ return ++nRef; } int Release(){ if(!--nRef) { delete this; return 0; } return nRef; } protected: virtual~c()//donot allow delete from outsides { } int nRef; };
就是通过C内部的计数来判断什么时候释放自己的资源。当然需要A/B在适当时候调用AddRef/Release了。 下面是一个简单的实现。 struct a{ a(c* pc) { m_pc=pc; pc->AddRef(); } void do_Sth(){ ;//...使用完成m_pc了 m_pc->Release(); m_pv=NULL; } protected: c* m_pc; } class b的结构和a也差不多,就不写了 下面是main函数: void main() { c* pc=new c; a clsA(pc); b clsB(pc); pc->Release();//ok pc was hold by both clsA and clsB,so we don't need it.release. pc=NULL; a.do_sth(); b.do_sth(); ;//should no memory leak } 注意事项: 因为是在类成员函数里面delete this的,所以在此语句以后,不能访问任何的成员变量及虚函数,否则一定非法。 |
原文链接:
http://blog.csdn.net/augusdi/article/details/4642349