GCC在调试模式下崩溃,在发布模式下运行良好?

时间:2012-08-10 12:48:08

标签: c++ debugging gcc crash

我有这个简单的循环,运行一个基类指针数组:

Object * objects[2];

objects[0] = new GreenObject;
objects[1] = new RedObject;
objects[2] = new BlueObject;


for (int i = 0; i < 3; ++i) {
    cout << i << " ";
    objects[i]->info();
}

在调试模式下,当调用i方法时,程序在输出info()后立即在循环的第三次迭代时崩溃。在发布模式下没有这样的事情,它正在运行它应该。这不是对象的问题,因为即使我使用其他派生类它也会锁定。

Windows 7 64位下的GCC 4.4.0

有什么想法吗?

2 个答案:

答案 0 :(得分:8)

这是(和for循环)超出数组的结尾:

objects[2] = new BlueObject;

导致未定义的行为。它在发布中运行的事实只是(非)幸运。未定义行为的一个子集,它的行为与您期望的一样。

数组索引从0运行到N - 1,其中N是数组中元素的数量。对于objects,有效索引仅为01。将objects的声明更改为:

Object * objects[3];

答案 1 :(得分:6)

访问objects[2]是未定义的行为。

期望编程错误始终导致崩溃或明显失败是一个常见的错误。

未定义的行为意味着任何事情都可能发生,包括出现以便在某些情况下工作。

如果您想要可预测的,可重复的行为,那么您应该编写正确的代码。