std :: map help в классе обработчиков изображений - PullRequest
2 голосов
/ 05 декабря 2011

Я пишу обработчик изображений для движка. Пока все идет хорошо (я думаю), но мне нужна помощь с удалением изображений. У меня есть опыт работы с vector с, но не с map с.

В обработчике изображений есть std :: map, который имеет 2 элемента:

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

Тогда у меня есть 2 метода в моем классе ImageHandler:

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

Вот смелость этих 2 методов:

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*);

Так что я думаю, что мне нужен доступ к элементу second итератора по определенному индексу карты. До сих пор я делаю это правильно и как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 05 декабря 2011

Как это:

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;
}
1 голос
/ 05 декабря 2011

Да, вы правы, вы бы сделали

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;
}
...