delete this,dll导出类及如何写plugins(PART I)

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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;

aclsA(pc);

bclsB(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的,所以在此语句以后,不能访问任何的成员变量及虚函数,否则一定非法。

另外的一个用处将在后面说明。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航