用常規方法遍歷qmap,刪除滿足條件元素時出現「讀取位置0***x時發生訪問衝突」。檢視「呼叫堆疊」指向qmap::iterator::operator++()
和qmapnode::nextnode()
定位為刪除iterator中元素引起iterator的遍歷異常,特記錄如下:
qmap::iterator iter; //遍歷map
for (iter = timermap_t1_i->begin(); iter != timermap_t1_i->end(); iter++)
}
錯誤在於: iter指標在元素被刪除後失效了,回到for語句中與timermap_t1_i->end()
進行比較時發生錯誤
qmap::iterator iter; //遍歷map
for (iter = timermap_t1_i->begin(); iter != timermap_t1_i->end(); )
else
}
timermap_t1_i->erase(iter++)
中map中在刪除iter的時候,先將iter做快取為iter1,然後執行iter++使之指向下乙個結點,再進入erase函式體中執行刪除操作,刪除時使用的iter其實是快取下來的iter1(也就是當前iter(做了加操作之後的iter)所指向結點的上乙個結點)。
這和timermap_t1_i->erase(iter); iter++;
這種執行序列是不相同的。前者在erase執行前進行了加操作,在iter被刪除(失效)前進行了加操作,是安全的;後者是在erase執行後才進行加操作,而此時iter已經被刪除(當前的迭代器已經失效了),對乙個已經失效的迭代器進行加操作,行為是不可預期的,這種寫法勢必會導致 map操作的失敗並引起程序的異常。
qmap在進行 erase 之後,當前迭代器會失效
++操作符前置和後置的特性
stl map高效遍歷刪除的方法
在遍歷中使用 iterator/reverse_iterator 進行 erase 的用法
QMap和std map的遍歷
兩種遍歷方式都使用迭代器 1qmap使用iterator.key 和iterator.value 方法獲取第乙個或第二個元素的值。而std map使用iterator first iterator second 來獲取第乙個或第二個元素的值。qmapm ratiocfg qmap iterator ...
C 異常處理 使用throw引發異常
c 提供了throw語句來引發異常。使用throw語句既可以引發系統異常,也可以引發自定義異常。使用throw語句丟擲異常的語法如下 throw exobject exobject 所要丟擲的異常物件,這個異常物件是派生自system.exception類的類物件。例項 如下 using syste...
C 異常處理 使用throw引發異常
c 提供了throw語句來引發異常。使用throw語句既可以引發系統異常,也可以引發自定義異常。使用throw語句丟擲異常的語法如下 throw exobject exobject 所要丟擲的異常物件,這個異常物件是派生自system.exception類的類物件。例項 如下 using syste...