当包含它的对象调用其析构函数时,unique_ptr是否会取消分配?

时间:2019-03-27 16:09:37

标签: c++

假设我有这些课程。

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会自行取消分配吗?否则,我们是否需要做一些事情来取消分配它们?

3 个答案:

答案 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中对象的析构函数