2012-10-22 68 views

回答

0

堆。調用COM API產生一個對象,API爲調用者提供一個句柄(這實際上對應於一個指針)。一旦對COM API的調用返回,堆棧分配會使句柄引用釋放的內存。

+0

謝謝..我同意COM對象的內存將分配在堆中。是否有任何特定的工具來查找堆內存中的內存泄漏和堆棧分配的內存?儘管有很多工具可用來查找泄漏,但這些工具是否會發現堆或堆棧內存泄漏? – raj

+1

在堆棧內存中沒有泄漏。堆棧內存是自動的,這意味着當執行超出定義本地(即棧上)變量的範圍時,它將被自動釋放。 – SomeWittyUsername

+0

@raj Icepack是對的。當您忘記在堆上分配的「空閒」或「刪除」內存時,會發生內存泄漏。根據您正在開發的平臺,有很多工具可以檢測泄漏。 –

0

實際上,分配完全取決於組件。當您調用CoCreateInstance時,COM會加載組件並調用其導出的DllGetClassObject函數以獲取IClassFactory實現來實例化該類,然後調用IClassFactory :: CreateInstance,這當然是由該組件實現的。是的,在C++中它將使用堆。但在C#或任何.NET語言中,它將使用垃圾回收堆(儘管CCW(COM Callable Wrapper)將使用本地堆)。

+0

謝謝..我同意COM對象的內存將獲得分配在堆中。是否有任何特定的工具來查找堆內存中的內存泄漏和堆棧分配內存?儘管有很多工具可用來查找泄漏,但這些工具是否會發現堆或堆棧內存泄漏? – raj

0

堆是用來存儲動態內存,因此從DLL請求的內存將被加載到堆中。但是,我相信對DLL中的函數的調用仍然會使用堆棧空間來執行。

+0

按定義,任何函數調用都使用堆棧空間:http://en.wikipedia.org/wiki/Call_stack。這與該功能的實際目的無關。 – SomeWittyUsername