我正在为引擎编写一个图像处理程序。到目前为止它已经相当不错了(我想),但我需要帮助删除图像。我有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*);
所以我认为我需要在特定的地图索引处访问迭代器的第二个元素。我到目前为止做得对吗?我怎么能做到这一点?
答案 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;
}