Re: [問題] 跨 DLL 的問題

看板C_and_CPP作者 (我想把整片天空打開)時間16年前 (2009/04/03 06:28), 編輯推噓2(204)
留言6則, 2人參與, 最新討論串3/3 (看更多)
很久沒發文了,一寫就是一篇純推測,而沒實證過的文: 跨 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
個人還是perfer shared_ptr,至少目前我己知有兩牌
04/03 15:06, 1F

04/03 15:07, , 2F
compiler內建有shared_ptr(也是TR1標準)
04/03 15:07, 2F

04/03 15:07, , 3F
Loki還是在用Design Pattern時才會用 :P
04/03 15:07, 3F

04/03 15:08, , 4F
話說Boost的說明頁也有refer到Loki::SmartPtr XD
04/03 15:08, 4F

04/03 15:54, , 5F
除此之外 virtual function 也是問題
04/03 15:54, 5F

04/03 15:55, , 6F
要自己 implement virtual table
04/03 15:55, 6F
文章代碼(AID): #19rQoB0i (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #19rQoB0i (C_and_CPP)