最近看don box的編譯鏈結都過了,執行到removechild一行時彈出p==0的斷言錯誤,直接開啟atlcomcli.h 在150行附近有如下**:
//the assert on operator& usually indicates a bug. if this is really //what is needed, however, take the address of the p member explicitly. t** operator&() throw()
看到這裡,我可以說 "i got it"了,removechild介面第二個引數接受的是指標的指標,這意味著removechild的介面實現會改變p的值,但是removechild的介面實現中沒有用到智慧型指標,所以介面實現中不會自動addref或releash,這樣會造成計數器混亂,記憶體洩漏。
以後用智慧型指標一定要在可控的範圍之內。
後記: 今天(09/09/25)下午和一位同事聊到智慧型指標的使用,他說我的這種情況在<r3. 當被呼叫方便要改寫方法或者函式的[in,out]引數, 並且引數的初始值為非空時。注意,[out]引數往往被 假定 「輸入時為空值」,所以被呼叫永遠也不必釋放[out]引數。
經驗總結 智慧型指標不是萬能的
最近看don box的 編譯鏈結都過了,執行到removechild一行時彈出p 0的斷言錯誤,直接開啟atlcomcli.h 在150行附近有如下 看到這裡,我可以說 i got it 了,removechild介面第二個引數接受的是指標的指標,這意味著removechild的介面實現會改變p的值...
智慧型指標和萬能指標
智慧型指標 智慧型指標 smart pointer 是儲存指向動態分配 堆 物件指標的類。除了能夠在適當的時間自動刪除指向的物件外,他們的工作機制很像c 的內建指標。智慧型指標在面對異常的時候格外有用,因為他們能夠確保正確的銷毀動態分配的物件。他們也可以用於跟蹤被多使用者共享的動態分配物件。智慧型指...
經驗不是萬能的 驢子馱鹽
乙隻驢子馱著一包鹽。鹽很沉,驢子馱得氣喘吁吁。在渡河時,驢子一不留神滑了一跤,跌進河裡。頃刻間,那包鹽被河水溶化,然後沖走了。驢子站起來後,頓覺背上輕鬆許多。於是它欣喜若狂,認為自己獲得了讓自己更輕鬆的 經驗 後來,這只驢子又馱了一大捆棉花。來到河邊,它以為再跌進河裡就可以同上次一樣減輕重量,於是就...