4
A
回答
4
忘記在應該的時候調用Release()。使用CComPtr <>,CComVARIANT <>和CComBSTR來幫助你。
7
無法爲COM對象使用RAII包裝類型。特別是不使用CComPtr<>
,CComBSTR
和CComVARIANT<>
。這些對象幫助通過消除從開發人員釋放底層資源的責任來防止泄漏。包裝對象強制釋放它的析構函數中的資源。
我看到的泄漏或意外的FreeS的另一個原因是從CComPtr<T>
到T*
隱式轉換的結果。這對於傳遞包裝對象作爲參數非常有用。但是它可能會導致問題,因爲它允許RAII對象和原始指針之間的隱式轉換。例如
CComPtr<IFoo> GetAFoo(); // Imagine if this creates the object
...
IFoo* pFoo = GetAFoo();
pFoo->SomeCall();
在這種情況下對SomeCall的調用可能會失敗,因爲對象pFoo在此時已經死亡。爲什麼?該值從GetAFoo的ref計數返回1,分配給pFoo,然後遞減爲0並刪除,因爲臨時值超出了範圍。
2
有兩個主要原因:不使用RAII(智能指針)和誤用RAII。
如果您使用原始指針 - IInterface *或BSTR,則可能會忘記調用IInterface :: Release()或SysFreeString()並導致泄漏。如果您錯誤地使用智能指針,您也會冒內存泄漏的風險。一種方法是你提到的 - 將初始化的CComBSTR :: operator &()作爲[out]參數傳遞。還有其他一些方法,例如在禁用ATLASSERT的情況下將初始化智能指針的CComPtr :: operator &()或CCOmQIPtr :: operator &()作爲[out]參數傳遞。或者用一個循環創建任何類似圖形的結構,然後完全釋放它,這樣循環中的每個對象都會保持智能指針並防止釋放。
相關問題
- 1. 什麼是PHP內存泄漏的常見原因?
- 2. 內存泄漏的常見原因
- 3. IASetIndexBuffer內存泄漏原因
- 4. 這種潛在的內存泄漏的原因是什麼?
- 5. 是什麼原因造成我的內存泄漏的OpenCV
- 6. 這個奇怪的Scala內存泄漏的原因是什麼?
- 7. 內存泄漏和分段故障的一些常見原因是什麼?
- 8. 如何解決內存泄漏問題在tomcat中,發現內存泄漏的原因是什麼
- 9. jQuery內存泄漏模式和原因
- 10. 以下示例中導致內存泄漏的原因是什麼?
- 11. Tkinter畫布造成這種內存泄漏的原因是什麼?
- 12. 如何使用泄漏消毒劑找到內存泄漏的原因
- 13. 爲什麼這是內存泄漏
- 14. 什麼是造成內存泄漏?
- 15. DOM:爲什麼這是內存泄漏?
- 16. 爲什麼我收到內存泄漏
- 17. 內存泄露的原因
- 18. 這條泄漏線背後的原因是什麼?
- 19. 內存泄漏的異常
- 20. CTFontCopyFamilyName()的原因泄漏
- 21. 幫助找到一個內存泄漏原因
- 22. 我在tomcat控制檯中遇到了內存泄漏異常
- 23. Websphere中存在內存泄漏的原因ValueHandlerPool(懷疑)
- 24. 是內存泄漏?爲什麼java.lang.ref.Finalizer吃了這麼多內存
- 25. COM C#內存泄漏跟蹤
- 26. 如何跟蹤COM內存泄漏
- 27. 內存泄漏 - WCF異常
- 28. 內存泄漏[String]常量
- 29. Android內存泄漏異常
- 30. 'strdup'泄漏 - 未知原因