我正在写资源管理器。这就是它的样子:shared_ptr-如何忽略第一个参考?
#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
我应该怎么办?
一个问题:关键仍然是... –
没有太大的问题,如果它是一个。将Manager设置为'shared_from_this',将'T *'的创建者和'T *'的驱逐者传递给Manager,让它包含'shared_ptr'和一个清除函数,该函数同时调用'unregister'和在这个共享指针副本上'销毁',并在管理器中创建一个静态'std :: shared_ptr CreateInstance()'。作为副作用,这也可以防止遗漏被缓存。现在,对于真正的图像缓存,您还必须处理磁盘上的文件被更改的可能性,并孤立旧的缓存条目和未完成的shared_ptrs。 – Yakk