delete this,dll導出類及如何寫plugins(PART I) [轉]

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的,所以在此語句以後,不能訪問任何的成員變量及虛函數,否則一定非法。


另外的一個用處將在後面說明。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章