gpt4 book ai didi

c++列表迭代器的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 13:30:04 25 4
gpt4 key购买 nike

我无法访问指向 map 内列表的迭代器。尽管网上描述了很多类似的问题,但我没有找到正确的解释。

我有一个包含“可见对象”的管理器对象;当它们是单个时,它们存储在 map 中,当它们可以是多个同名时,它们存储在 map 内的列表中。我有一些必须浏览整个 map 的功能,并且在尝试访问列表迭代器时程序崩溃。

我会尽量只给你必要的,如果需要的话再要求更多。

管理器.h :

class VisibleObject;

class Manager
{
public:
~Manager ();

bool addObject (std::string, VisibleObject*);
bool addObjectToList (std::string, VisibleObject*);

bool removeObject (std::string);
bool removeObjectList (std::string);
void clean ();

VisibleObject* getObject (std::string);
std::list<VisibleObject*>* getObjectList (std::string);

void updateAll (float);
void drawAll (sf::RenderWindow&);

private:
std::map<std::string, VisibleObject*> m_objects;
std::map<std::string, std::list<VisibleObject*>> m_objectLists;
};

在 Manager.cpp 中:

/// Add a single object
bool Manager::addObject (std::string p_name, VisibleObject* p_object)
{
std::map<std::string, VisibleObject*>::iterator itr = m_objects.find(p_name);
if (itr != m_objects.end())
return false;
m_objects.insert(std::pair<std::string, VisibleObject*> (p_name, p_object));
return true;
}

/// Add an object to a list (create list if needed)
bool Manager::addObjectToList (std::string p_name, VisibleObject* p_object)
{
std::map<std::string, std::list<VisibleObject*>>::iterator itr = m_objectLists.find(p_name);
if (itr != m_objectLists.end())
{
itr->second.push_back(p_object);
return true;
} else
{
std::list<VisibleObject*> objectList;
m_objectLists.insert(std::pair<std::string, std::list<VisibleObject*>> (p_name, objectList));
m_objectLists[p_name].push_back(p_object);
return false;
}
}

/// This is where the problem occures
void Manager::drawAll (sf::RenderWindow& p_window)
{
for (std::map<std::string, VisibleObject*>::iterator itr = m_objects.begin() ; itr != m_objects.end() ; itr++)
(*itr).second->draw(p_window); // Seems to work fine
for (std::map<std::string, std::list<VisibleObject*>>::iterator mapItr = m_objectLists.begin() ; mapItr != m_objectLists.end() ; mapItr++)
for (std::list<VisibleObject*>::iterator listItr = (*mapItr).second.begin() ; listItr != (*mapItr).second.end() ; listItr++)
(*listItr)->draw(p_window); // This is when I get a segmentation fault while debugging (signal SIGSEGV)
}

崩溃时应该已经有 2 个单个对象和许多列出的对象。

我没有更改构造函数,因为它看起来不像需要初始化的东西(唯一的问题是访问列表时)。VisibleObject::draw(...) 是虚拟的。

编辑:经理是静态类游戏的一个属性。这是我可以从任何类和添加一些对象的函数中获取管理器的部分:

Manager& Game::getManager ()
{
return m_manager;
}

void Game::start ()
{
Grid *grid = new Grid();
m_manager.addObject("GRID", grid);
Tetrimino *tetrimino = new Tetrimino();
m_manager.addObject("TETRIMINO", tetrimino);
/* ... */
}

我在对象网格的构造函数中添加了可见对象。我认为不需要更多解释:

Grid::Grid ()
{
VisibleObject::load("ressources/grid.png");
Square *square = NULL;
m_gridWidth = Game::getSettings().getInt("GRIDWIDTH");
m_gridHeight = Game::getSettings().getInt("GRIDHEIGHT");
m_squares.assign(m_gridWidth*m_gridHeight, square);
Manager &manager = Game::getManager();
for (int i=0 ; i<m_gridWidth*m_gridHeight ; i++)
manager.addObjectToList("SQUARE", square);
}

Manager 的析构函数应该删除每个对象(但它与问题无关,是吗?)

最佳答案

问题很可能是由于悬挂指针引起的。当 VisibleObject 被删除时,我没有看到任何更新 Manager 列表的代码。分割线

(*listItr)->draw(p_window);

进入

VisibleObject* object = *listIter;
object->draw(p_window);

然后,你可以判断问题出在列表迭代器上,我怀疑不是,或者问题是由悬空指针引起的。

关于c++列表迭代器的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31861841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com