我有一個關於COM的內存管理的一些問題:COM內存管理
我有一個COM方法:
STDMETHODIMP CWhitelistPolicy :: GetWebsitesStrings(SAFEARRAY **結果)
結果= SAFEARRAY(BSTR)。如果我從另一個接口方法(爲了設置*結果)接收到另一個SAFEARRAY(BSTR),是否必須複製接收到的字符串以將它們傳遞給* result和outside client?或者考慮到我不會爲自己使用這些字符串,我可以將它們傳遞給客戶(並傳遞所有權)?
2.
STDMETHODIMP CWhitelistPolicy::SetWebsitesStrings(SAFEARRAY* input)
在這裏,我接收BSTR陣列作爲輸入。我的方法再次負責輸入中分配的內存?
3.
STDMETHOD(SetUsers)(SAFEARRAY* input);
在這裏,我調用另一個接口(SetUsers)上的方法和我的輸入SAFEARRAY分配內存。在我打電話給SetUsers後,我可以處理SAFEARRAY?記憶總是在編組時發生,不是嗎? (在我的情況下,SetUsers方法在作爲我的進程內的COM DLL託管的接口上調用)
所以對我來說應該更清楚一點:-) - 作爲輸入接收的所有內存(從調用者的角度來看)不在我的所有權 - 這是服務器存根的工作。我作爲輸出傳遞的所有內存(從調用者的角度來看)都是我的所有權 - 即在方法調用之後,我必須釋放傳遞的內存,否則它會泄漏。 – Ghita
在你提供的情況下,是的。對於[in,out],如果你正在修改已經進入的數據,那麼存根就會釋放返回調用者之前返回的內容,所以如果要修改進來的內容,就必須釋放它。我更新了有關如何確定何時出錯的其他建議的答案。 –