错误:无法取消引用结束列表迭代器

时间:2019-05-20 16:42:28

标签: c++ list iterator

我用值填充了列表。我正试图一次又一次地使用它们。

我尝试过while (!config.empty())并在使用后删除了front()。仍然无法解决问题。

std::list<Object*> config;

已完成的配置(在config.push_back()之后):

config[0]:
int testnumber = 1;
string testname = "Test1"

config[1]:
int testnumber = 2;
string testname = "Test2";

config[2];
int testnumber = 3;
string testname = "Test3";
---------------------------------------------------------------------
Logic* pLogic;
Object* pObject = config.front(); // config[0]

if (pObject) // while(!config.empty()) -- tried here 
{
    // do something
    pLogic = new Logic(pObject);
    config.pop_front();
}

逻辑:

Object* m_pObject;

Logic::Logic(Object* pObject)
    :m_pObject(pObject)
 {}

  // Accessed config in other functions with m_pObject

代码可以正常工作并获取输出。但是最后得到 ERROR: Debug assertion failed Expression:cannot dereference end list iterator

2 个答案:

答案 0 :(得分:0)

while循环(while (pObject))内部,您没有更新(至少在发布的代码中)指针“ pObject”,因此它始终指向与开头相同的旧对象。在列表的顶部。此问题使循环无限循环,因此只要列表中有更多对象要弹出,它就可以工作。在使程序崩溃的问题上,它尝试从一个空列表中弹出一个元素,这是一个UB。

要解决此问题,您要做的就是:

pObject = config.front()

在行之后:

config.pop_front();

答案 1 :(得分:0)

我弄清楚了使用条件的地方。

这是它的样子,

Logic* pLogic;
if(!config.empty())
{
    Object* pObject = config.front(); // config[0]
    if (pObject)  
    {
         // do something
         pLogic = new Logic(pObject);
     }
     config.pop_front();
 }