(原)VS2013在Release情況下使用vector有時候會崩潰的一個可能原因


轉載請注明出處:

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解決了。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM