图像处理程序类中的std :: map帮助

时间:2011-12-05 02:52:52

标签: c++ iterator stdmap

我正在为引擎编写一个图像处理程序。到目前为止它已经相当不错了(我想),但我需要帮助删除图像。我有vector s的经验,但没有map的经验。

图像处理程序有一个std :: map,它有2个元素:

std::map<std::string, SDL_Surface*> image_list_;
std::map<std::string, SDL_Surface*>::iterator it;

然后我在ImageHandler类中有2个方法:

void AddImage(std::string/*file_name*/);
void DeleteImage(std::string/*file_name*/);

以下是这两种方法的内容:

bool ImageHandler::AddImage(std::string file_name)
{
    SDL_Surface* temp = NULL;
    if ((temp = Image::Load(file_name)) == NULL)
        return false;
    image_list_.insert(std::pair<std::string, SDL_Surface*>(file_name, temp));
    SDL_FreeSurface(temp);
    return true;
}

bool ImageHandler::DeleteImage(std::string file_name)
{
    if (image_list_.empty()) return;
    it = image_list_.find(file_name);
    if (!it) return false;
    image_list_.erase(it);
    return true;
}

我还没有编译这段代码,所以我不知道任何语法错误。如果存在,你可以看看那些。

我认为我的DeleteImage方法会将其从map中移除,但为了避免在加载图片时出现内存泄漏,我需要这样做:

SDL_FreeSurface(SDL_Surface*);

所以我认为我需要在特定的地图索引处访问迭代器的第二个元素。我到目前为止做得对吗?我怎么能做到这一点?

2 个答案:

答案 0 :(得分:1)

是的,你是对的,你会做的

SDL_FreeSurface(it->second);
在之前

将其从地图中删除。

这将使功能:

bool ImageHandler::DeleteImage(std::string file_name)
{
    if (image_list_.empty()) return;
    it = image_list_.find(file_name);
    if (!it) return false;
    SDL_FreeSurface(it->second);
    image_list_.erase(it);
    return true;
}

答案 1 :(得分:1)

像这样:

bool ImageHandler::DeleteImage(std::string const & file_name)
{
  if ((it = image_list_.find(file_name)) == image_list_.end())
  {
    return false;
  }

  SDL_FreeSurface(it->second);
  image_list_.erase(it);
  return true;
}