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

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

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

最佳答案

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

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

10-08 16:18