我有这个简单的循环,运行一个基类指针数组:
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
有什么想法吗?
答案 0 :(得分:8)
这是(和for
循环)超出数组的结尾:
objects[2] = new BlueObject;
导致未定义的行为。它在发布中运行的事实只是(非)幸运。未定义行为的一个子集,它的行为与您期望的一样。
数组索引从0
运行到N - 1
,其中N
是数组中元素的数量。对于objects
,有效索引仅为0
和1
。将objects
的声明更改为:
Object * objects[3];
答案 1 :(得分:6)
访问objects[2]
是未定义的行为。
期望编程错误始终导致崩溃或明显失败是一个常见的错误。
未定义的行为意味着任何事情都可能发生,包括出现以便在某些情况下工作。
如果您想要可预测的,可重复的行为,那么您应该编写正确的代码。