-1

对不起,如果这听起来像“它编译,所以它必须工作!” 问题,但我想了解为什么会发生某些事情(或没有发生,视情况而定)。

在项目设置中,我设置Basic Runtime ChecksBoth. 调试器告诉我:

运行时检查失败 #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这就是导致错误的原因。

4

2 回答 2

4

如果没有重现问题的代码,您的问题将无法回答。

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

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

这称为未定义行为,是由错误地使用语言引起的(但不会导致编译失败)。缓冲区溢出只是几十个示例之一。

于 2011-07-31T04:23:52.907 回答
1

原来我的 Visual Studio 安装有问题,所以重新安装它解决了这个问题。

于 2011-08-02T01:58:05.627 回答