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

发布于 2024-12-19 18:06:31 字数 1227 浏览 3 评论 0原文

我正在为引擎编写一个图像处理程序。到目前为止,一切进展顺利(我认为),但我需要删除图像方面的帮助。我有使用矢量的经验,但没有使用地图的经验。

图像处理程序有一个 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*/);

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

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

I am writing an imagehandler for an engine. So far it's going pretty good (I think) but I need help with deleting images. I have experience with vectors but not with maps.

The image handler has an std::map which has 2 elements:

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

Then i have 2 methods in my ImageHandler class:

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

Here are the guts of these 2 methods:

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

I haven't compiled this code so I am not aware of any syntax errors. If any exist you can just look past those.

I think my DeleteImage method will remove it from the map but to avoid memory leaks when it loads an image I need to do this:

SDL_FreeSurface(SDL_Surface*);

So I think I need to access an iterator's second element at a specific map index. Am I doing it right so far and how would I be able to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

长不大的小祸害 2024-12-26 18:06:31

像这样:

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

Like this:

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;
}
邮友 2024-12-26 18:06:31

是的,你是对的,你会

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

Yes you're right, you would do

SDL_FreeSurface(it->second);

before you erase it from the map.

That would make the function:

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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文