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

  • 相关阅读:
    codesmith 模板
    asp.net 开发知识小结【转】
    一种页面数据错误输入提示方法 【转】
    vs2008 调试js
    安装vs2008出现的问题
    Godaddy主机导入MSSQL数据库教程
    asp.net用url重写URLReWriter实现任意二级域名(续)
    Visio2007 与Microsoft Studio 2008不兼容
    dos 必知八项命令
    Godaddy空间设置说明
  • 原文地址:https://www.cnblogs.com/darkknightzh/p/5016352.html
Copyright © 2020-2023  润新知