由于我无法弄清楚的段错误,我在我的程序上运行了 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 会使迭代器无效吗?