【问题标题】:Comparing weak_ptr to raw pointer doesn't work, looking for alternative将weak_ptr与原始指针进行比较不起作用,寻找替代方案
【发布时间】:2012-07-29 05:03:49
【问题描述】:

我有一个 SpriteManager 类,它为我加载和缓存精灵,并从缓存中删除未使用的精灵。无论如何,这就是我的想法,我有点卡住了。我有一个map<string,weak_ptr<ALLEGRO_BITMAP>>,我在其中存储精灵,并使用weak_ptr 生成shared_ptr。现在我正在尝试使用一个删除器,它也从地图中删除位图,它看起来像这样(显然不工作):

[&bitmaps](ALLEGRO_BITMAP* bmp){
        for(auto it = bitmaps.begin(); it!=bitmaps.end(); ++it) {
            if((*it).second == bmp) {
                bitmaps.erase(it);
                al_destroy_bitmap(bmp);
                break;
            }
        }
}

位图就是我所说的地图。当然我无法比较(*it).secondbmp,但我也无法锁定weak_ptr,因为我在删除器中。除了保留弱指针和原始指针之外,我真的别无选择吗?

【问题讨论】:

  • 应该没有必要自己删除原始指针。当引用计数变为零时,使用它的 shared_ptrs 将负责删除。当然,如果你需要一个特殊的删除器,应该在 share_ptr 构建期间提供。
  • 当位图被删除时,我需要将位图从我的地图中删除,我想我已经表达得很清楚了。我正在提供一个特殊的删除器,问题在于它的定义。

标签: c++ c++11 shared-ptr resource-management weak-ptr


【解决方案1】:

将迭代器与&bitmaps 一起存储到删除器中映射中的weak_ptr。然后删除它。

[&bitmaps, iter](ALLEGRO_BITMAP* bmp){
    bitmaps.erase(iter);
    al_destroy_bitmap(bmp);
}

【讨论】:

  • 等等,如果同时修改了地图,迭代器是否真的保持有效。
  • @Cubic 是的,对于std::map,这是有保证的。
  • @Cubic, yurikilocheck:如果迭代器指向的元素被删除,它就不会保持有效,所以答案是否定的。查看 here 的失效规则(在 c++03 中,但我怀疑对于 c++11 进行了更改)
  • @Grizzly 显然,如果您删除迭代器引用的元素,则迭代器将失效。我假设修改是指插入/擦除其他元素。但是你为什么关心这个?这个weak_ptr可以从其他地方的地图上删除吗?
  • 不,它不能。当然,如果元素被删除,迭代器是无效的,我也不是指那个。你的回答对我来说就像一个魅力。我认为 Grizzly 只是想说明您所说的 技术上 不正确,因为存在使迭代器或其他内容无效的修改操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多