配列内のポインタを検証しようとしていたので、メモリエラーは発生しませんでした。
そしてこの方法:
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 ++はそれを超えて、関数を呼び出します。あらゆる種類のランダムな場所であらゆる種類の実行時エラーがありますが、ここから来るのは未定義の動作であるとほぼ確信しています。