【问题标题】:std::list iteratorstd::list 迭代器
【发布时间】:2012-03-01 14:16:35
【问题描述】:

以下代码不是将指针返回到它返回的 audioResource 其他无效的东西,我已经用调试器完成了,问题出在这一行

return *list_it;

这是我的功能:

AudioResource* AudioManager::getResource(const unsigned int ID)
{
    std::list<AudioResource*>::iterator list_it;
    for(list_it = m_resources.begin(); list_it!= m_resources.end(); list_it++)
    {
        if((*list_it)->getID()==ID)
            {
std::cout<<*(*list_it)->getFileName();
            return *list_it;
        }
    }
    return nullptr;
}

O,我试过把它写成 (*list_it) 但我得到了相同的结果 =s

它是如何填充的...

Resource* AudioManager::addResource(const unsigned int ID, 
      const std::string fileName,  const unsigned int scope,
      const std::string type)
{
     AudioResource* temp;
     if(type == "AUDIO_TYPE_SAMPLE")
     {
          temp = new AudioResource(ID,fileName,scope,
                      RESOURCE_AUDIO,AUDIO_TYPE_SAMPLE);
          m_resources.push_back(temp);
     }
     else if(type == "AUDIO_TYPE_STREAM")
     {
          temp = new AudioResource(ID,fileName,scope,
                    RESOURCE_AUDIO,AUDIO_TYPE_STREAM);
          m_resources.push_back(temp);
     }

     return temp;
}

调用获取资源

cout<<AudioManager::getInstance()->getResource(IDnum)->getFileName();

【问题讨论】:

  • 设计思路:为什么是list 而不是vector?还是map?为什么是原始指针? :)
  • 您确定AudioResource* 有效吗?也许迭代器是正确的,是错误的后备列表。
  • 看起来还不错(nit:后增量可能会带来更差的性能)。如何初始化 m_resources?
  • 您能说明m_resources 是如何填充的吗?
  • 一切正常。我会说其他一些代码从集合中删除了一个指针并且没有将其删除或将其设置为nullptr

标签: c++ list std


【解决方案1】:

如果type 不是这两个值中的任何一个,则将未初始化的指针添加到m_resources

AudioResource* temp;
if(type == "AUDIO_TYPE_SAMPLE")
{
    temp = new AudioResource(ID,fileName,scope,RESOURCE_AUDIO,AUDIO_TYPE_SAMPLE);
}
else if(type == "AUDIO_TYPE_STREAM")
{
    temp = new AudioResource(ID,fileName,scope,RESOURCE_AUDIO,AUDIO_TYPE_STREAM);
}
m_resources.push_back(temp);

temp初始化为NULL,如果temp != NULL仅添加到m_resources

此外,该函数返回相同的未初始化指针。

【讨论】:

  • 代码已被修改,因此如果不在 else 语句中并且问题仍然存在,则不会将任何内容推送到列表中,感谢您的尝试 =)
  • 仍在返回未初始化的指针:被调用者使用?
  • 暂时不忽略返回数据,因为我还没有完成资源管理器的其余部分的编码 =)
  • 但这不是他的代码。他在 ifs 内做 push_back。确实,该函数将返回一个无效的指针,但据我所知,它并没有被添加到列表中。
  • @ChrisCondy,元素会在任何地方从m_resources 中删除吗?
【解决方案2】:

如果ID 不存在,您将返回nullptr,但您永远不会在调用站点检查它,如果ID 不存在,这将为您提供空指针访问,并且可能会创建问题。

AudioManager::getInstance()->getResource(IDnum)->getFileName();

改成

AudioResource* res = AudioManager::getInstance()->getResource(IDnum);
if(res)
  std::cout << res->getFileName();

【讨论】:

  • 代码已经被修改,所以这个问题被避免了,原来的问题仍然存在
  • 他将它推入列表的哪个位置?
  • @ChrisCondy:您有任何代码可以从列表中删除内容吗?您是否可以同时访问该列表?
  • @CashCow:如果您阅读过其他 cmets,您会注意到 OP 更改代码之后我们的回答指出缺陷出来。
  • 没有从列表中删除,不,我不是多线程 =)
猜你喜欢
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
相关资源
最近更新 更多