遍歷QMap引發異常處理

2021-07-30 02:33:38 字數 1078 閱讀 2089

用常規方法遍歷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...