COM智能指針(Smart Pointer)的陷阱

        最近在寫一個MSXML4.0的包裝類,針對自己的項目實現一些實用功能。
使用了COM的智能指針,發現使用智能指針有一些需注意的問題。
       智能指針的最大陷阱就是所謂的它能夠自動銷燬。
       我們知道,智能指針提供一種棧上對象管理堆上對象的方法,使用棧上
對象的生存週期去控制堆對象的生存週期,比如我們在某個大括號裏聲明瞭
一個CComPtr對象,當這個大括號結束時,它就自動調用Release,把自己釋
放。

        既然說到COM的智能指針,那就不能不提CoInitialize(Ex)這個函數,它用
來初始化COM庫,並把當前線程加入到一個Department中。每一個CoInitialize都應有
一個CoUninitialize與之對應的,這也帶來了問題。
        我的類裏有些函數需返回一個IXMLDOMNodePtr,於是我把它做成一個成員變
量,專門用來返回,免得每次都在函數內構造;可是程序運行結束時會有內存錯誤;
而在函數內構造一個IXMLDOMNodePtr並將它返回卻沒問題。經檢查發現,是因爲
我沒有在我的析構函數裏調用CoUninitialize,而是在另一個函數CloseDocument裏調用
它,導致在類對象銷燬之前就已經調用了CoUninitialize,所以此時無論顯式還是隱式
(自動)調用Release,都會因爲所有的COM資源都已經被回收而失敗。故有以下忠告:
*********************************************************************
忠告:請保證所有的智能指針在調用CoUninitialize之前都已經被釋放,必
                要的話手工顯式釋放之。
*********************************************************************

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章