MSVC ++表示变量周围的堆栈已损坏但程序正常运行

时间:2011-07-31 04:19:00

标签: c++ runtime-error visual-c++-2010 stack-corruption

很抱歉,如果这听起来像是“它编译,那么一定要工作!”问题,但我想了解为什么会发生某些事情(或者根据具体情况不会发生)。

在“项目设置”中,我将Basic Runtime Checks设置为Both。调试器通知我:

  

运行时检查失败#2 - 变量'beg'周围的堆栈已损坏。

但如果我将其设置为默认值,即无,则程序运行并正常完成,不会抛出异常并且不会导致错误。

我的问题是,我可以安全地忽略这一点(因为MSVC ++可能会有些错误)或者这是一个真正的问题吗?我没看到当堆栈被搞砸时程序如何能够成功继续。

<小时/> 编辑:

导致此错误的函数看起来完全如下:

int fun(list<int>::iterator&, const list<int>::iterator&);

int foo(list<int>& l) {
    list<int>::iterator beg = l.begin();
    list<int>::iterator end = l.end();
    return fun(beg, end);
}

fun增加并在beg上运行,当它返回beg == end时,当MSVC ++中断时,它指向结束}

<小时/> 编辑2:

我已经解决了这个问题。在某些情况下,fun会从拥有其迭代项目的list中删除一些元素。这是导致错误的原因。

2 个答案:

答案 0 :(得分:4)

如果没有重现问题的代码,您的问题就无法解决。

但是对你的一般问题给出一个模糊的答案 - 如果编译器或调试器检测到问题,你可能有一个问题。

在C ++中,只是因为“出错”并不意味着你的程序会崩溃 - 它可能会继续以完全不可预测的结果运行。它甚至可以完成您想要的结果。但仅仅因为它在您的系统上运行良好并不能为您提供任何其他系统,编译器,一天中的时间,甚至是同一程序的额外运行的保证。

这称为undefined behavior,是由于语言使用不正确引起的(但不会导致编译失败)。缓冲区溢出只是数十个示例中的一个。

答案 1 :(得分:1)

事实证明我的Visual Studio安装出了问题,所以重新安装它可以解决问题。