在C++中使用COM(組件對象模型)創建的對象是將堆分配還是堆棧分配的內存?使用COM創建的對象是否會分配堆或堆棧分配的內存?
回答
堆。調用COM API產生一個對象,API爲調用者提供一個句柄(這實際上對應於一個指針)。一旦對COM API的調用返回,堆棧分配會使句柄引用釋放的內存。
實際上,分配完全取決於組件。當您調用CoCreateInstance時,COM會加載組件並調用其導出的DllGetClassObject函數以獲取IClassFactory實現來實例化該類,然後調用IClassFactory :: CreateInstance,這當然是由該組件實現的。是的,在C++中它將使用堆。但在C#或任何.NET語言中,它將使用垃圾回收堆(儘管CCW(COM Callable Wrapper)將使用本地堆)。
謝謝..我同意COM對象的內存將獲得分配在堆中。是否有任何特定的工具來查找堆內存中的內存泄漏和堆棧分配內存?儘管有很多工具可用來查找泄漏,但這些工具是否會發現堆或堆棧內存泄漏? – raj
堆是用來存儲動態內存,因此從DLL請求的內存將被加載到堆中。但是,我相信對DLL中的函數的調用仍然會使用堆棧空間來執行。
按定義,任何函數調用都使用堆棧空間:http://en.wikipedia.org/wiki/Call_stack。這與該功能的實際目的無關。 – SomeWittyUsername
- 1. 堆棧或堆上的對象分配
- 2. 對象分配在堆棧或堆C++
- 3. 內存分配,堆棧和堆棧
- 4. 堆棧幀內存分配
- 5. 堆分配的對象是否將其成員分配到堆棧上?
- 6. Java堆和堆棧內存分配
- 7. 受保護的堆對象堆棧vs堆棧分配
- 8. 堆棧或堆棧分配不正確
- 9. 如何判斷CString是否在堆或棧上分配內存?
- 10. 基於堆棧的內存分配
- 11. 基於C++堆棧的對象分配
- 12. POSIX調用堆棧內存分配
- 13. 分配在堆或棧上?
- 14. 檢測堆棧或堆分配
- 15. C++堆棧與堆分配
- 16. Stackoverflow沒有發生,試圖找出是否分配堆棧或堆內存
- 17. C++是堆棧還是堆分配?
- 18. 這個內存在哪裏分配 - 堆或堆棧?
- 19. 創建OBJECT數組時,分配的內存(堆棧和堆引用)如何?
- 20. 在堆棧上創建對象時分配的內存在哪裏?
- 21. 如何判斷是否有堆或堆棧分配?
- 22. mmap是否連續分配堆內存?
- 23. 遞歸堆棧內存分配
- 24. 內存分配(指針和堆棧)
- 25. 動態堆棧內存重新分配
- 26. C堆棧分配
- 27. g ++在堆棧上分配未使用的內存是什麼?
- 28. 是在java中堆棧或堆中分配的數組的內存?
- 29. 堆陣列分配而不是堆棧
- 30. 成員函數內存分配堆棧還是堆?
謝謝..我同意COM對象的內存將分配在堆中。是否有任何特定的工具來查找堆內存中的內存泄漏和堆棧分配的內存?儘管有很多工具可用來查找泄漏,但這些工具是否會發現堆或堆棧內存泄漏? – raj
在堆棧內存中沒有泄漏。堆棧內存是自動的,這意味着當執行超出定義本地(即棧上)變量的範圍時,它將被自動釋放。 – SomeWittyUsername
@raj Icepack是對的。當您忘記在堆上分配的「空閒」或「刪除」內存時,會發生內存泄漏。根據您正在開發的平臺,有很多工具可以檢測泄漏。 –