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

    技术2022-05-11  120

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

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

     


    最新回复(0)