Re: [問題] 跨 DLL 的問題
很久沒發文了,一寫就是一篇純推測,而沒實證過的文:
跨 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
推
04/03 15:06, , 1F
04/03 15:06, 1F
→
04/03 15:07, , 2F
04/03 15:07, 2F
→
04/03 15:07, , 3F
04/03 15:07, 3F
→
04/03 15:08, , 4F
04/03 15:08, 4F
推
04/03 15:54, , 5F
04/03 15:54, 5F
→
04/03 15:55, , 6F
04/03 15:55, 6F
討論串 (同標題文章)
完整討論串 (本文為第 3 之 3 篇):
問題
8
34