VS2013在Release情况下使用vector有时候会崩溃的一个可能原因
轉(zhuǎn)載請注明出處:
http://www.cnblogs.com/darkknightzh/p/5016352.html
?
參考網(wǎng)址:
http://www.cnblogs.com/BryZ/archive/2011/06/21/2085865.html
http://www.cppblog.com/super-/archive/2009/06/18/88006.aspx
?
調(diào)試程序,在debug下沒問題,release時,程序崩潰。后來發(fā)現(xiàn),是vector聲明的向量,打印出來size是357395012這么大。。。在push_back之后,程序直接崩潰。(以前用vector時,即便push_back結(jié)構(gòu)體,也不會崩潰。這次不知道為什么,就崩潰了,不確定程序其他地方是否還有潛在問題,再調(diào)試吧。)
?
后來網(wǎng)上搜了一下,網(wǎng)上的說法是:
?
原因是Checked Iterator機制導(dǎo)致迭代器異常拋出,而未被catch捕獲。(Checked Iterator是指具有越界檢查功能的迭代器,并且會在檢查到越界操作時觸發(fā)運行時錯誤處理。)
_SECURE_SCL如果定義為0,迭代器檢查(Checked Iterator)將被禁用。
事實上如果開啟了迭代器檢查,每次內(nèi)存偏移都會調(diào)用_invalid_parameter_noinfo,導(dǎo)致操作更耗時,有興趣可以在匯編中對比兩者——所以,建議在編寫release版本時手動關(guān)閉該宏。
?
vc在release時,加入了迭代子檢測;
程序可以強制修改_SECURE_SCL為0,就可以解決問題了;
?
為了強制修改_SECURE_SCL宏,在頭文件上作如下修改,之后vector聲明的向量的size就是0了:
?
注:下面的是將define放在include的后面:
對比上面兩張圖,可以發(fā)現(xiàn),第一張圖時,未定義_SECURE_SCL宏,因而直接定義;第二張圖,宏_SECURE_SCL已經(jīng)定義了,因而重定義該宏。但是,對于第二張圖,雖然將_SECURE_SCL宏也設(shè)置為1,但是vector聲明的向量的size依舊是357395012這么大。猜測原因是,先include的,導(dǎo)致vector庫里面,_SECURE_SCL依舊為0,因而size很大。這應(yīng)該涉及到include包含文件先后順序的問題了。
不過,不理解的是,為啥上面說的是將_SECURE_SCL設(shè)置為0,我這邊設(shè)置為1解決了。。。
總結(jié)
以上是生活随笔為你收集整理的VS2013在Release情况下使用vector有时候会崩溃的一个可能原因的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win32应用程序创建流程
- 下一篇: 3-5:常见任务和主要工具之归档和备份