【发布时间】:2010-07-24 17:27:57
【问题描述】:
我有一个像这样定义的 3D 矢量...
std::vector<std::vector<std::list<Object*> > > m_objectTiles;
我有这个代码...
void ObjectManager::AddObject( Object *object ) {
m_objects.push_back( object );
m_objectTypes.insert( std::make_pair(
ObjectAttorney::GetType( object ), object ));
int x = ObjectAttorney::GetTileX( object );
int y = ObjectAttorney::GetTileY( object );
m_objectTiles[x][y].push_back( object ); // SEG FAULT HERE
}
收到此错误0x0805ccdb in std::vector<std::list<Object*, std::allocator<Object*> >, std::allocator<std::list<Object*, std::allocator<Object*> > > >::operator[] ( this=0x8157758, object=0x8173f30) at /usr/include/c++/4.4/bits/stl_vector.h:611 { return *(this->_M_impl._M_start + __n); }
我改成这个来测试一下……
void ObjectManager::AddObject( Object *object ) {
m_objects.push_back( object );
m_objectTypes.insert( std::make_pair(
ObjectAttorney::GetType( object ), object ));
int x = ObjectAttorney::GetTileX( object );
int y = ObjectAttorney::GetTileY( object );
std::list<Object*> *l = &m_objectTiles[x][y];
if ( l ) { // SEG FAULT HERE
l->push_back( object );
} else {
std::cout << "List null.\n";
}
}
它只是给出一条错误消息,说明段错误发生的位置ObjectManager::AddObject (this=0x81577a0, object=0x8165760) at ObjectManager.cpp:381 if ( l ) {
为什么在测试空指针时会出现段错误?显然 operator [] 正在返回损坏或无效的内容。不知道这里有什么问题。任何帮助表示赞赏。谢谢。
【问题讨论】:
-
作为起点,您可以将
std::vector<std::vector<std::list<Object*> > >替换为一些封装类...
标签: c++ list 3d vector segmentation-fault