gpt4 book ai didi

c++ - 如何控制shared_ptr引用计数?

转载 作者:行者123 更新时间:2023-12-02 10:23:05 24 4
gpt4 key购买 nike

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

这是负责加载 Assets 的代码。

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

关于c++ - 如何控制shared_ptr引用计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59214126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com