理解できないセグメンテーション違反のため、プログラムでvalgrindを実行しました。ここで問題が検出されました...
Address 0x75c7670 is 0 bytes inside a block of size 12 free'd
at 0x4024851: operator delete(void*) (vg_replace_malloc.c:387)
by 0x805F6D8: std::list<Object*, std::allocator<Object*>::remove(O
bject* const&) (new_allocator.h:95)
除去はこの方法で行われます...
void ObjectManager::AdjustGridCoord( int x, int y, Object* const obj ) {
// GetTileX and GetTileY guaranteed to be valid indices
int newX = ObjectAttorney::GetTileX( obj );
int newY = ObjectAttorney::GetTileY( obj );
if ( x != newX || y != newY ) {
m_objGrid[x][y].remove( obj );
m_objGrid[newX][newY].push_back( obj );
}
}
リストからポインタを削除しても、ポインタが必要になるとは思いませんでしdelete
た。ここで何が疑わしいですか?さらに詳しい情報が必要な場合はお知らせください。
PS以前、これをデバッグしたときに、GetTileXとGetTileYが有効なインデックスではなく、13775864のようなばかげた数値を返すために問題が発生したことに気付きました。ただし、これは問題に関連していると思いますdelete
。削除またはpush_backが問題の原因です。
編集:これは別のコードスニペットです
for ( unsigned int x = 0; x < m_objGrid.size(); ++x ) {
for ( unsigned int y = 0; y < m_objGrid[x].size(); ++y ) {
for ( ListItr obj = m_objGrid[x][y].begin(); obj != m_objGrid[x][y].end(); ++obj ) {
ObjectAttorney::UpdateAI( *obj );
AdjustGridCoord( x, y, *obj );
}
}
}
AdjustGridCoordがイテレータを無効にしている可能性がありますか?