作者avhacker (我想把整片天空打開)
看板C_and_CPP
標題Re: [問題] 跨 DLL 的問題
時間Fri Apr 3 14:28:26 2009
很久沒發文了,一寫就是一篇純推測,而沒實證過的文:
跨 module 的物件存取,若是傳的是 pointer,則一般操作上沒問
題,就像 COM 物件一樣,這一堆 COM 的東西也不一定都是同一個
compiler 的產品。
問題在於 deallocate 這些物件,例如 new 的就要 delete,COM
的改用呼叫 member function AddRef/Release,但直接用 delete
會 call 到各家 compiler 對記憶體釋放時不同的時作。
這部分可以參考 COM,例如:
class Foo{
public:
virtual void Destroy() = 0;
};
class FooImp{
public:
virtual void Destroy() { delete this; }
~FooImp() { ... }
};
假設你在 Module A 拿到從 Module B 傳回來的 Foo *pFoo,在
用完時就 call pFoo->Destroy() 就行了.
那跟 shared_ptr 有什麼關係? 請看 share_ptr 的文件:
http://www.boost.org/doc/libs/1_38_0/libs/smart_ptr/shared_ptr.htm
有一個 constructor 長的是這樣:
template<class Y, class D> shared_ptr(Y * p, D d);
其中這個 D 就是 deallocator,也就是你可以自訂在 reference count 降
為 0 時,要怎麼處理該物件。因此你可以讓 reference count 降為 0 時
呼叫 p->Destroy(),這樣這個問題就解決了。
當然,講到 smart pointer, 還是 Loki 的最威,不過真要解說就太累人了.
最後我還是強調:以上是推測的,沒實證過,至少沒有全部實證過。實證過
的那部分是跨 module 時用 p->Destroy() 來解構其傳送的物件,這部分概
念與 COM 相同。至於包在 smart pointer 裡面傳送我就沒試過了,只有在
client 端以 smart pointer 接起 raw pointer.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.67.30.1
推 legnaleurc:個人還是perfer shared_ptr,至少目前我己知有兩牌 04/03 15:06
→ legnaleurc:compiler內建有shared_ptr(也是TR1標準) 04/03 15:07
→ legnaleurc:Loki還是在用Design Pattern時才會用 :P 04/03 15:07
→ legnaleurc:話說Boost的說明頁也有refer到Loki::SmartPtr XD 04/03 15:08
推 littleshan:除此之外 virtual function 也是問題 04/03 15:54
→ littleshan:要自己 implement virtual table 04/03 15:55