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

GCC crash in debug mode, runs fine in release mode?

本文关键字:模式 运行 调试 崩溃 GCC 布模式      更新时间:2023-10-16

我有一个简单的循环,运行一系列基类指针:

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

有什么想法吗?

这是

(和for循环)超出数组的末尾:

objects[2] = new BlueObject;

导致未定义的行为。它在发布中运行的事实只是(不)幸运。未定义行为的一个子集是它的行为符合您的预期。

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

Object * objects[3];

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

期望编程错误总是导致崩溃或明显故障是一个常见的错误。

未定义的行为意味着任何事情都可能发生,包括在某些情况下看起来有效。

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