定位問題4--為什么剛創(chuàng)建的對象使用時就沒有了?
如下代碼
Timer timer = createTimerEng(.....);
operationList.push_back({session, key, timer,0});
printf("insert key %s timer %p callBackData %p",key.c_str(),timer,callBackData);
startTimer(timer);-----------------在timer的庫里打印了失敗,這明顯是剛創(chuàng)建的啊,怎么回事?
背景:
createTimerEng/startTimer 為三方庫提供的方法,其它項目使用也沒有問題。但是這里startTimer失敗,打印了錯誤日志。
現象:
1. 上述代碼,在createTimerEng創(chuàng)建的時候,沒有錯誤
2. printf 打印的指針也不是空的
3. 運行startTimer----三方庫,此時就報錯,但這個庫是其它人用的好好的
定位:
嘗試過多種方法
1. 單獨按三方庫的指導寫了下timer----正常
----初步確認三方庫沒有問題
2. 分析打印,這里打印的指針地址也沒有問題
-------------------------------------------------耗費了較多時間
struct OperationItem {
std::string a;
UsbDeviceKey b;
Timer timer;
int retryTimes;
bool operator==(const OperationItem& other) const {
return session == other.session && key == other.key;
}
~OperationItem() {
if(timer != nullptr){
deleteTimer(timer);-------------------------------------拷貝的臨時對象析構時,這里針將這個timer delete 掉
timer = nullptr;
}
}
};
3. 單獨分析資源釋放操作
----發(fā)現 operationList.push_back({session, key, timer,0}); 這里有一次拷貝構造函數調用,有一個臨時對象,在臨時對象析構時,會delete timer
經驗:
1. 從日志分析,不要忽略了潛在的操作----如這里的拷貝復制
2. 對資源的管理,還需慎之又慎
----但過尤不及,探討語言的新特性來管理這里的資源-----------待研究具體的方法
3. 對資源的使用建立明確的規(guī)則,如
3.1. 明確這里timer的使用和釋放,由誰來操作,資源管理集中
3.2. 有明確的規(guī)范來操作此事,如通過類來封裝,或使用類似智能指針的方法
總結
1. 研究一個更好的自動釋放的方法,類封裝,或接口封裝,或使用語言的特性(auto_ptr等,但需要研究清楚使用場景再使用)
2. 明確規(guī)則,資源管理集中
2.1. 如:將timer集中到當前類管理,那么 OperationItem 類就不能有deleteTimer的職責
2.2. 或將 create delete Timer都放到 OperationItem 中管理
2.3. 單獨封裝資源管理,通過auto_ptr或其它方式,共享,并插入數據結構
最終使用了這里的 2.1 ,原因如下
1. 修改最小
2. 好理解

浙公網安備 33010602011771號