2012-08-10 161 views
0

我有这样简单的循环,通过基类的指针数组运行:GCC在调试模式下崩溃,在发布模式下运行良好?

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()方法。在发布模式中不会发生这种情况,它正在运行。这不是该对象的问题,因为即使我使用其他派生类,它也会锁定。

GCC 4.4.0在Windows 7 64位

任何想法?

回答

8

这是(和for环)超出阵列的末尾:

objects[2] = new BlueObject; 

造成未定义的行为。它在发布中运行的事实只是(非)幸运的。未定义行为的一个子集是行为像你期望的那样。

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

Object * objects[3]; 
+0

是的,我知道该阵列比它需要的时间短,我的挫败感是它在发布模式下工作。 – dtech 2012-08-10 12:54:28

+1

它可能有帮助,如果你提到你知道它是在问题中的错误,说“它正在运行,因为它应该”_暗示你认为代码是正确的。 – 2012-08-10 13:01:56

+0

您的程序的内存布局可能因版本和调试设置而异。正如hmjd所说,这完全是未定义的行为。 – Black 2012-08-10 13:02:55

6

访问objects[2]是不确定的行为。

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

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

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

相关问题