在release模式下使用vector下崩潰的問題
阿新 • • 發佈:2019-02-19
昨天遇到一個奇怪的問題,在debug下除錯完成的程式,在release模式下總會崩潰,由於release除錯跟蹤功能偏弱,跟蹤數遍之後才發現是在一個vector的push_back時出現異常。
一般有三種情況:
1、在vector使用之前先reserve(預留)一個大小。(這個原因實在沒查出來)
2、VS2005編譯Release版STL加入了迭代子檢測,其中可能會有bug。經測試Unicode版的比較容易出這個問題,就是莫名其妙的迭代器錯誤。
微軟的原文:The bug afflicted all Standard containers (vector, deque, list, set, multiset, map, multimap, and string) when _HAS_ITERATOR_DEBUGGING was disabled and _SECURE_SCL was enabled. Additionally, deque was afflicted when both were disabled.解決辦法是使用之前將下面這個巨集重新設為0:
#ifndef _DEBUG
#define _SECURE_SCL 0
#endif
3.vector同時讀寫引發。vc2005 對於迭代器的匹配非常嚴格,通常這種錯誤是因為兩個不同的迭代器操作同一個 vector,或者是因為迭代器在遍歷vector時,vector的連結串列改變了,比如vector在遍歷的途中,別的位置push_back()一個元素,這時迭代器失效,導致錯誤。可以使用臨界區互斥訪問。