我实现了一个简单的 ResourceManager - 一切都很好,直到我尝试实现它的析构函数以进行(紧急)清理(例如在致命异常的情况下)。我无法找到一种方法来做到这一点:
template<typename T>
class ResourceManager
{
public:
std::unordered_map<std::string, std::weak_ptr<T> > resource_map;
std::shared_ptr<T> getResource(std::string name)
{
std::shared_ptr<T> res = resource_map[name].lock();
if(!res)
{
res = std::shared_ptr<T>(new T(this, name));
resource_map[name] = res;
}
return std::move(res);
}
void Release(std::string name)
{
resource_map.erase(name);
};
~ResourceManager(void) { /* ???? */}
};
class Texture
{
private:
ResourceManager<Texture> * manager_;
std::string name_;
public:
Texture(ResourceManager<Texture> * manager, std::string& name)
: manager_(manager), name_(name) { }
~Texture(void){
manager_->Release(name_);
}
};
显然,我必须遍历所有活动资源......但是如果 ResourceManager 在技术上不是资源的(唯一)所有者,我该如何释放它们?这可能是设计缺陷,如果是这种情况,请提出替代方案。
编辑:为了响应答案,定义“资源管理器”我想象权威缓存 - 存储对资源的引用,可以查找资源(=无重复)并管理它们在内存中的状态(内存中,仅描述(=路径+type) 和 freed),所有这些都尽可能自动化。(应该有单独的 ResourceLoaders,但这对于这个问题并没有太大变化)