2012-01-27 34 views
0

我試圖創建一個COM對象的映射到特定的散列,就像一個字符串。這是我正在執行的一種緩存算法。這個想法是,如果你嘗試加載一個已經被前面一行代碼打開的文件,它會將已經創建的內存塊作爲IStream返回,而不用再把文件重新加載到內存中。我碰到的一個問題是COM對象在刪除最後一個引用時會自動銷燬自己。原始容器不知道該對象已被銷燬,並且,當您訪問已釋放的對象時,它將返回無效的內存句柄,而不是加載該文件。有沒有更好的方法來實現這一點,或者我應該放棄STL而改用自己的容器?在COM對象上使用std :: map?

+2

使用智能指針指向地圖中的COM對象。這樣它將保留一個引用,直到不再需要爲止,防止它被過早刪除。 – 2012-01-27 18:10:11

回答

1

這是一個錯誤,將接口指針放在容器中的代碼忘記調用AddRef()。 永不存儲指向COM接口的指針,而不增加它們的引用計數。

+1

容器沒有*忘記*調用AddRef,它從來沒有被設計爲首先這樣做。在將其添加到容器之前自己調用AddRef,或者使用智能指針 - Microsoft有助於提供2個選項。 – 2012-01-27 19:33:30

+0

我最終爲可以包含COM對象的容器編寫了自己的算法。看起來比重寫大部分代碼庫更簡單。 – Alex 2012-03-23 19:04:43