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

1.为什么要使用delete this,以及如何使用。
(1)
考查这样的情况:
有两个对象A,B需要访问同一个多态对象C
因为C一般是通过new 操作构造的,一定要自己释放,但是对象A,B都需要使用它,并且B不知道A什么时候使用完成CA也不知道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什么时候使用完成CA也不知道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

转载于:https://my.oschina.net/chen106106/blog/45061

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值