如何控制 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;
}
}
}
我正在为我的游戏引擎创建资源管理器。基本上它有一个 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;
}
}
}