(原)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解决了。。。

posted on 2015-12-03 15:17  darkknightzh  阅读(3220)  评论(0编辑  收藏  举报

导航