問題背景:今天在維護幾個月前的代碼,發現一個詭異的BUG。。
問題描述:在QTreeWidget 中 的一列中 加入一個按鈕 ,在更新數據時,直接調用 clear(),讓後就 引發異常了。按鈕是一個new出來的指針。
問題解決:在clear() 調用之前 先把 按鈕的指針 delete 掉 就可以解決這個問題。
問題總結:在clear()時,要把通過void QTreeWidget::setItemWidget(QTreeWidgetItem * item, int column, QWidget * widget)
加上去的 QWidget 指針 delete掉 (不要忘了置空)
問題反思:出現這個問題其實並不是太關鍵,主要是定位問題出在哪裏了很棘手,沒法快速定位問題。因爲之前寫的代碼,經驗不足,delete後的指針沒有=NULL; 出現異常後,很顯然是指針問題,可以模塊中指針調用的有點複雜(因爲 那個按鈕是在 用戶點擊 treewidget的item 才動態創建,還要動態回收)。導致這個指針不確定是不是野指針導致的問題。最後把所有delete 後全部添加 指針=NULL;然後在創建按鈕是 進行 NULL檢查 差慢慢鎖定問題出在 clear()前 要釋放指針 。 總之 ,釋放內存後 一定要把指針 =NULL ; 幾個月前寫代碼沒有領悟到這點 ,坑啊 !!
現在對內存管理有一定把握了,並且進行了總結 。