看板 C_and_CPP 關於我們 聯絡資訊
很久沒發文了,一寫就是一篇純推測,而沒實證過的文: 跨 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