0

配列内のポインタを検証しようとしていたので、メモリエラーは発生しませんでした。

そしてこの方法:

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 ++はそれを超えて、関数を呼び出します。あらゆる種類のランダムな場所であらゆる種類の実行時エラーがありますが、ここから来るのは未定義の動作であるとほぼ確信しています。

4

1 に答える 1

0

next_putの値を決定するロジックが表示されません。単にents[]の長さを超えている可能性はありますか?その場合、ents []を適切に初期化したとしても、ループが配列の最後から外れると、そのメモリは初期化されません(少なくとも期待どおり)。if(ents [i]!= NULL )が渡されます(その後、プログラムがクラッシュするはずです)。

于 2013-02-25T04:54:55.813 に答える