我正在写资源管理器。这就是它的样子:
#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。
我该怎么办?