轉載請注明出處:
http://www.cnblogs.com/darkknightzh/p/5016352.html
參考網址:
http://www.cnblogs.com/BryZ/archive/2011/06/21/2085865.html
http://www.cppblog.com/super-/archive/2009/06/18/88006.aspx
調試程序,在debug下沒問題,release時,程序崩潰。后來發現,是vector聲明的向量,打印出來size是357395012這么大。。。在push_back之后,程序直接崩潰。(以前用vector時,即便push_back結構體,也不會崩潰。這次不知道為什么,就崩潰了,不確定程序其他地方是否還有潛在問題,再調試吧。)
后來網上搜了一下,網上的說法是:
原因是Checked Iterator機制導致迭代器異常拋出,而未被catch捕獲。(Checked Iterator是指具有越界檢查功能的迭代器,並且會在檢查到越界操作時觸發運行時錯誤處理。)
_SECURE_SCL如果定義為0,迭代器檢查(Checked Iterator)將被禁用。
事實上如果開啟了迭代器檢查,每次內存偏移都會調用_invalid_parameter_noinfo,導致操作更耗時,有興趣可以在匯編中對比兩者——所以,建議在編寫release版本時手動關閉該宏。
vc在release時,加入了迭代子檢測;
程序可以強制修改_SECURE_SCL為0,就可以解決問題了;
為了強制修改_SECURE_SCL宏,在頭文件上作如下修改,之后vector聲明的向量的size就是0了:
注:下面的是將define放在include的后面:
對比上面兩張圖,可以發現,第一張圖時,未定義_SECURE_SCL宏,因而直接定義;第二張圖,宏_SECURE_SCL已經定義了,因而重定義該宏。但是,對於第二張圖,雖然將_SECURE_SCL宏也設置為1,但是vector聲明的向量的size依舊是357395012這么大。猜測原因是,先include的,導致vector庫里面,_SECURE_SCL依舊為0,因而size很大。這應該涉及到include包含文件先后順序的問題了。
不過,不理解的是,為啥上面說的是將_SECURE_SCL設置為0,我這邊設置為1解決了。。。