std::列表迭代器

std::list iterator

本文关键字:迭代器 列表 std      更新时间:2023-10-16

以下代码没有返回指向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();

如果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

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

如果ID不存在,则返回nullptr,但从不在调用站点对其进行检查,如果ID不存在,这将为您提供空指针访问权限,这可能会产生问题。

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

将其更改为

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