指向类的空指针

时间:2013-02-25 04:46:51

标签: c++ class pointers null

我试图验证数组中的指针,所以我没有造成任何内存错误,

和这个方法:

for(int i=0;i<array_size;i++) {
     if (array[i]!=NULL)
          array[i]->stuff();
     }
}

过去曾有过工作。

现在,我必须做同样的事情,除了根据对象变量按顺序完成。

我的新方法是:

Direct2Entity* nextset[MAX_ENTS]; // ents[MAX_ENTS] is also a Direct2Entity* array
for(int i=0;i<MAX_ENTS;i++) {
    nextset[i]=NULL; // note that ents[] is also flushed before this
}
int nextsetid=0;
int maxn;
bool stillnull;
while(true) { // infinite sorting loop
    maxn=-1;
    stillnull=true;
    for(int i=0;i<next_put;i++) {
        if (ents[i]!=NULL) {
            stillnull=false;
            if (ents[i]->depth<0) { // make sure no infinite loops occur with negative depth
                ents[i]->depth=0;
            }
            if (ents[i]->depth>maxn) {
                nextset[nextsetid++]=ents[i];
                ents[i]=NULL; // make NULL to further loop
            }
        }
    }
    if (stillnull) break;
}
for(int i=0;i<next_put;i++) {
    if (nextset[i]!=NULL) {
        ents[i]=nextset[i]; // copy nextset[] to ents[]
    }
}
for(int i=0;i<next_put;i++) {
    if (ents[i]!=NULL) {
        if (ents[i]->getroom()==current_room) {
            ents[i]->draw(this); // ents[i] is still NULL... ?
        }
    }
}

在最后一个for循环中,显式检查了ents [i]以确保它不会取消引用NULL指针。然而,C ++过去并调用了函数。各种随机位置都存在各种运行时错误,但我几乎可以肯定这是来自这里的未定义行为。

1 个答案:

答案 0 :(得分:0)

我没有看到确定next_put值的逻辑。是否有可能超过ents []的长度?如果是这样,即使你已经正确地初始化了ents [],当你的循环离开数组的末尾时,那个内存也没有被初始化(至少你预期的那样)和你的if(ents [i]!= NULL )将被传递(然后你的程序应该崩溃)。