C ++程序......超调?

时间:2011-12-01 02:39:23

标签: c++ debugging

我在C ++方面很不错,但我可能错过了一些适用于此的细微差别。或许我完全错过了一个巨大的概念,我不知道。我的程序立即崩溃(“blah.exe没有响应”)约1/5次运行(其他时候它运行完全正常)并且我将问题跟踪到一个构造函数,用于在主要功能的开头。以下是导致问题的代码(在构造函数中):

int ii;
for(ii=0;ii<=255;ii++)
{
    cout<<"ent "<<ii<<endl;
    entity_list[ii]=NULL;
}
for(ii=0;ii<=255;ii++)
{
    cout<<"sec "<<ii<<endl;
    sector_list[ii]=NULL;
}
entity_list[0] = new Entity(0,0);
entity_list[0]->_world = this;

特别是第二个for循环。 cout引用是新的,以便告诉它有麻烦的地方。它会将整个“ent 1”打印到“ent 255”,然后将“sec 1”打印到“sec 255”,然后立即崩溃,好像它是第二次for循环的第257次运行。我设置第二个for循环直到“ii&lt; = 254”停止所有崩溃。 C ++代码是否倾向于“过冲”循环或什么?是什么导致它在这个特定的循环中崩溃似乎是随机的?

顺便说一句,entity_list和sector_list分别指向名为Entity和Sector的类,但它们没有构造任何东西,所以我认为它不相关。我还在头文件中有一个Entity类的前向声明,但由于没有构建,我认为它也不相关。

2 个答案:

答案 0 :(得分:9)

你超越了阵列的范围。

根据您在Charles的回答中的评论,您说:

  

我刚在世界级中将它们声明为entity_list [255]和   sector_list [255]

这就是你的问题所在。通过声明它们包含255个元素,这意味着您只能访问元素a[0]a[254](如果计算它们,您会发现这是255个元素。如果索引a[255]存在,那就意味着有256个元素。)


现在提出一个问题:当你访问数组范围之外的元素时,为什么它的行为如此不规律?

原因是因为访问数组边界之外的元素是 C ++中未定义的行为。我无法告诉你应该做什么,因为它已经故意左未定义(不要问我为什么 - 也许有人知道可以发表评论?)。

这意味着结果将是零星的和不可预测的,尤其是当您在不同的机器上运行时。

它可能工作得很好。它可能会崩溃。它可能会删除你的硬盘! (这个不太可能,但这样做不会违反C ++协议!)

底线 - 仅仅因为你有一个奇怪的或不存在的错误信息并不意味着它没问题。只是不要这样做。

答案 1 :(得分:1)

你是如何申报entity_list和sector_list的?请记住,您使用的是基于0的索引,因此如果从ii = 0到ii <= 255,则需要256个桶,而不是255个。