私はリソースマネージャーを書いています。それはそれがどのように見えるかです:
#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);
ポインタには1つの参照があります。さて、このポインタを取得したいとき
resource_ptr ptr = resourceManager.get("t1");
参照カウンターが増加します。したがって、このリソースをもう使用したくない場合
resourceManager.release(ptr);
この時点でこのリソースを削除したいのですが、参照カウンターの値は1です。
私は何をすべきか?