2010-12-20 82 views
2

遇到第三方庫的內存管理問題。我有源代碼,但它非常複雜(COM的東西),充滿了宏和煩人的微軟標註等,並與另一個庫,我不必啓動的源相互作用。現在一些快速調試運行時已經表明它存在內存泄漏,並且有一個很大的方法。我廣泛使用像unique_ptr這樣的自釋放指針,並且知道我釋放了我創建的所有內容。是我唯一的選擇來嘗試清理(並理解)源代碼?外部存儲器管理和COM

另外,是否可以安全地使用operator new分配COM對象,還是必須進入COM堆?

回答

2

COM對於如何分配自己的COM對象是完全不可知的。它們由類工廠創建,並且您的IUnknown :: AddRef和Release方法保留引用計數。使用類工廠中的operator new和Release中的delete this很好。

你必須小心你在接口方法中返回的任何指針。典型的自動化對象,如BSTR和SAFEARRAY確實需要在COM堆中分配,以便客戶端代碼可以釋放它們。很難搞砸了,API完成了這項工作。

客戶端代碼可以負責泄漏,摸索引用計數是一個非常標準的COM錯誤。當你有權訪問AddRef/Release實現時,通常很容易診斷。在Vista或Win7中進行調試也是強烈建議的,它們有一個更好的堆管理器,它不會默默地忽略從錯誤的堆中釋放內存的嘗試。

如果你確定它是COM服務器泄漏,然後用<crtdbg.h>標題和單元測試來隔離問題以實現接口方法。

+0

+1,也應該使用'SysAllocString()'系列函數在專用堆上分配BSTR,只有這樣。 – sharptooth 2010-12-21 06:13:53