假设我有这些课程。
Resource.h
template<typename T>
class Resource
{
protected:
// bunch of member variable
std::unique_ptr<T> resource;
public:
Resource();
~Resource();
};
ResourceManager.h
template<typename T>
class ResourceManager
{
protected:
std::unordered_map<std::string, Resource<T>> resources;
public:
ResourceManager();
~ResourceManager()
{
resources.clear();
}
};
resources.clear()
从地图上删除所有元素,并调用对象的析构函数。我的问题是,unique_ptr会自行取消分配吗?否则,我们是否需要做一些事情来取消分配它们?
答案 0 :(得分:6)
当包含它的对象调用其析构函数时,unique_ptr是否会取消分配?
简而言之;是的。
析构函数中的 resources.clear();
是多余的。 unordered_map
被销毁时(ResourceManager
被销毁时)将被自动清除,这将自动销毁所有unique_ptr
,从而反过来分配其资源。您无需执行任何操作。
答案 1 :(得分:3)
每个Resource()
实例的unique_ptr成员将被正确销毁,而无需添加任何额外的代码。
同样出于这个原因,您也无需显式调用clear()
,因为ResourceManager
的实例被销毁时会自动发生。
答案 2 :(得分:1)
没有必要在堆上创建一个std::unique_ptr
(新std :: unique_ptr )。
它的作用与简单的int
相同。超出范围时将被删除。
移除std::unique_ptr
后,将调用unique_ptr
中对象的析构函数