很抱歉,如果这听起来像是“它编译,那么一定要工作!”问题,但我想了解为什么会发生某些事情(或者根据具体情况不会发生)。
在“项目设置”中,我将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
中删除一些元素。这是导致错误的原因。
答案 0 :(得分:4)
如果没有重现问题的代码,您的问题就无法解决。
但是对你的一般问题给出一个模糊的答案 - 如果编译器或调试器检测到问题,你可能有一个问题。
在C ++中,只是因为“出错”并不意味着你的程序会崩溃 - 它可能会继续以完全不可预测的结果运行。它甚至可以完成您想要的结果。但仅仅因为它在您的系统上运行良好并不能为您提供任何其他系统,编译器,一天中的时间,甚至是同一程序的额外运行的保证。
这称为undefined behavior,是由于语言使用不正确引起的(但不会导致编译失败)。缓冲区溢出只是数十个示例中的一个。
答案 1 :(得分:1)
事实证明我的Visual Studio安装出了问题,所以重新安装它可以解决问题。