如何控制 shared_ptr 引用计数?

How to controll shared ptr reference count?

我正在为我的游戏引擎创建资源管理器。基本上它有一个 unordered_map 将资源的路径存储为键,并将其存储为加载的资源的值。

这是负责加载资源的代码。

std::shared_ptr<T> LoadAsset(const String& _path)
{
    if (auto asset = m_assets.find(_path); asset != m_assets.end()) {
        return std::static_pointer_cast<T>(asset->second);
    }

    auto asset = std::move(LoadAssetInternal(_path));
    if (!asset) {
        return nullptr;
    }

    m_assets[_path] = std::move(asset);

    return std::static_pointer_cast<T>(m_assets[_path]);
}

问题是,当我调用 LoadAsset 方法时,返回的 shared_ptr 变量总是有 2 个强引用,当我删除保存资源的变量时,引用计数变为 1,并且资源永远不会被释放节目结束。

示例:

auto tex = LoadAsset<Texture>("Data/Textures/Foo.tga"); // Strong refs = 2
tex = nullptr; // Strong refs = 1 and the loaded Foo.tga is never freed.

只需创建一个在游戏主循环结束时运行的函数。像这样

void PurgeAssets() {
    for (auto i = m_assets.begin(); i != m_assets.end();) {
        if (i->second.unique()) {
            i = m_assets.erase(i);
        }
        else {
            ++i;
        }
    }
}