gpt4 book ai didi

c++ - shared_ptr-如何忽略第一个引用?

转载 作者:行者123 更新时间:2023-11-30 00:37:32 25 4
gpt4 key购买 nike

我正在写资源管理器。这就是它的样子:

#pragma once

class IObject;
typedef std::shared_ptr<IObject> resource_ptr;
typedef std::map<std::string, resource_ptr> resources_map;

class ResourceManager
{
public:
ResourceManager(void);
~ResourceManager(void);

bool add(resource_ptr &resource);
resource_ptr get(const std::string &name);
void release(resource_ptr &ptr);

private:
resources_map resources;
};

bool ResourceManager::add(resource_ptr &resource)
{
assert(resource != nullptr);
resources_map::iterator it = resources.begin();

while(it != resources.end())
{
if(it->second == resource)
return false;
it++;
}

resources[resource->getName()] = move(resource);
return true;
}

resource_ptr ResourceManager::get(const std::string &name)
{
resources_map::iterator it = resources.find(name);

resource_ptr ret = (it != resources.end()) ? it->second : nullptr;
return ret;
}

void ResourceManager::release(resource_ptr &ptr)
{
assert(ptr);
resources_map::iterator it = resources.begin();

while(it != resources.end())
{
if(it->second == ptr) {
ptr.reset();

if(!it->second)
resources.erase(it);
return;
}

it++;
}
}

现在,当我添加新资源时

    resource_ptr t = resource_ptr(new Texture(renderer));
t->setName("t1");

resourceManager.add(t);

指针有一个引用。现在,当我想得到这个指针时

resource_ptr ptr = resourceManager.get("t1");

引用计数器增加。所以当我不想再使用这个资源的时候

resourceManager.release(ptr);

此时我想删除此资源,但引用计数器的值为 1。

我该怎么办?

最佳答案

首先,直接回答您的问题,这正是 weak_ptr 的用途。

它允许您“观察”一个引用计数的对象,但如果弱指针是唯一剩下的引用,则无需保持它的事件状态。

其次,不要编写管理器类。您需要“资源管理器”做什么? “管理”资源意味着什么?您将它们存储为共享指针,因此它们几乎可以自行管理。

任何时候您考虑编写“管理器”类时,您都应该停下来问问自己“这个类实际上应该做什么?”然后将其重命名为信息丰富且具体的名称。 “资源管理器”可以是任何东西,也可以什么都不是。我们知道它确实...与资源有关,但名称并未告诉我们什么那是什么。它是允许用户定位资源的索引吗?它是否管理资源的生命周期?它是否处理资源的加载和卸载?或者完全不同的东西?或者所有这些东西?

确定类应该做的件事,然后重命名它,使名称反射(reflect)那件事。

关于c++ - shared_ptr-如何忽略第一个引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13110588/

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