zoukankan      html  css  js  c++  java
  • (原)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解决了。。。

  • 相关阅读:
    Thinkphp 模板中使用自定义函数的方法
    thinkphp 邮件发送
    str_replace使用
    SQL备份一张表的数据
    error: Allowed memory size
    LitJson使用
    implode,explode的使用
    ModelState.AddModelError使用
    HTTP 错误 404.2
    验证码显示不出来,在THINKPHP中的使用
  • 原文地址:https://www.cnblogs.com/darkknightzh/p/5016352.html
Copyright © 2011-2022 走看看