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

Does unique_ptr get unallocated when the object containing it gets its destructor called?

本文关键字:unique ptr 是否 分配 包含它 对象 调用 析构函数      更新时间:2023-10-16

假设我有这些类。

资源.h

template<typename T>
class Resource
{
      protected:
              // bunch of member variable
              std::unique_ptr<T> resource;
      public: 
              Resource();
              ~Resource();
 };

资源管理器.h

template<typename T>
class ResourceManager
{
    protected:
        std::unordered_map<std::string, Resource<T>> resources;
    public:
        ResourceManager();
        ~ResourceManager()
        {
               resources.clear();
        }
 };

resources.clear() 从映射中删除所有元素,并调用对象的析构函数。我的问题是,unique_ptr是自己取消分配的,还是如果不是,我们是否必须做一些事情来取消分配它们?

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

总之;是的。

析构函数中的resources.clear();是多余的。unordered_map在销毁时(ResourceManager被销毁时(将自动清除,这将自动销毁所有unique_ptr,进而释放其资源。你不需要做任何事情

每个

Resource()实例的unique_ptr成员将被正确销毁,而无需添加任何额外的代码。

出于这个原因,你不需要显式调用clear(),因为这将在ResourceManager的实例被销毁时自动发生。

没有必要在堆上创建一个std::unique_ptr(new std::unique_ptr(。

它的作用与简单的int相同。当它超出范围时,它将被删除。删除std::unique_ptr将调用unique_ptr中对象的析构函数