ゲーム内で順番が必要な時間オブジェクトを参照するポインターのリストがあります。この例ではTimeObject*
、リストに 2 つ含まれています。このコードは、アイテムがリストから削除されるまで機能します。削除されると、他のアイテムが指すアドレスは無効になります。TimeObject
これが発生してもどちらも削除されません。ポインターのみがリストから削除されます。これは何が原因ですか?
TimeUnlink()
で呼び出されTimeObject::Tick()
ます。これは静的ではありませんが、リストは静的です。
Linux で GCC 4.6.2 を使用しています。プログラムはスレッド化されていません。
void TimeObject::TimeUnlink()
{
printf("Time unlink\n");
TimeObject::list_.remove(this);
timeobject_flags_.linked_ = 0;
}
void GameTime::GameTurn(uint16_t _time)
{
tick_ += _time;
for(std::list<TimeObject*>::iterator it = TimeObject::list_.begin(); it != TimeObject::list_.end(); ++it)
{
TimeObject *timeobject = *it;
printf("GameTurn %p\n", timeobject);
if(timeobject == NULL) { printf("continue\n"); continue; }
timeobject->time_ += _time;
if(timeobject->speed_ && timeobject->time_ >= timeobject->speed_)
{
while(timeobject->timeobject_flags_.linked_ && timeobject->time_ - timeobject->speed_ > 0)
{
timeobject->time_ -= timeobject->speed_;
if(timeobject->mapobject_)
{
timeobject->mapobject_->Tick();
}
}
}
}
}
エラー出力:
GameTurn 0xc1e048
GameTurn 0x696828
GameTurn 0xc1e048
GameTurn 0x696828
GameTurn 0xc1e048
GameTurn 0x696828
GameTurn 0xc1e048
Time unlink
GameTurn (nil)
continue
GameTurn 0xc1e030
Program received signal SIGSEGV, Segmentation fault.
0x00000000004059a1 in GameTime::GameTurn(unsigned short) ()