0

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

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();
}

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

Windows 7 64bit 下的 GCC 4.4.0

有任何想法吗?

4

2 回答 2

8

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

objects[2] = new BlueObject;

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

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

Object * objects[3];
于 2012-08-10T12:51:24.693 回答
6

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

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

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

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

于 2012-08-10T13:02:43.590 回答