(原)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解决了。。。
相关文章
- 迁移DB到PPAS时,碰到的一个JDBC 问题的解决方法
- linux如deepin manjaro对笔记本电脑电池的伤害解决方案:TLP:一个可以延长 Linux 笔记本电池寿命的高级电源管理工具
- 依赖注入[5]: 创建一个简易版的DI框架[下篇]
- Fiori应用出现乱码问题的一个原因
- 无法添加某个relationship给SAP CRM Product category的一个可能原因
- 进程与线程的一个简单解释
- 本地修改远端 SAP UI5 框架文件的一个小技巧
- Angular InjectionToken的一个具体使用例子
- 给刚入行Python的福利,一个Python高效薅羊毛工具,请低调使用。
- 零基础学Python-爬虫-2、scrapy框架(测试案例篇·技术点在后面文章内讲解)【测试将一篇小说的所有访问路径与标题存储到一个文件下】
- 合并两个有序数组为一个新的有序数组
- go语言笔记——切片底层本质是共享数组内存!!!绝对不要用指针指向 slice切片本身已经是一个引用类型就是指针
- e739. 创建一个标签组件
- Dart基础第12篇:一个类实现多个接口 以及Dart中的Mixins