最近,我遇到了一个包含私有唯一指针成员变量的类。在构造函数中,它使用make_unique进行初始化,并在析构函数中使用reset进行清除。我知道make_unique执行堆分配。有这个开销的原因吗?为什么不使用"正常"成员变量。
答案 0 :(得分:4)
制作类的unique_ptr
成员变量有几个正当理由。没有看到课程,我不能说哪个,如果有的话;正如我在评论中写的那样,在析构函数中明确地调用reset
似乎非常糟糕,所以我认为我不会给作者带来疑问。
以下是我能想到的一些原因:
unique_ptr<Base>
,实际上您可以指向Derived
。 std::mutex
有很大关系;作为一个变量变量,这是非常尴尬的。在17中,可以从函数返回不可移动的对象,因此它们并没有那么糟糕。但是在14或之前,不可移动的物体真的很刺激。因此,您的对象可以保持unique_ptr<mutex>
而仍然可以移动。这种类型的移动成本很高(有大量成员的结构)或者不遵守适当的异常安全保证(但这很少有效恕我直言)。unique_ptr<InitInfo>
或类似的东西,你可以调用reset
,这样一旦你的程序启动并运行在长期运行的关键部分中,你就会返回大量的内存。使用unique_ptr
的一个不错但常见的原因是推迟初始化,即你需要构建一个比对象更晚构造的成员。这通常很糟糕,但即使您需要这样做,也可以使用optional
。
答案 1 :(得分:1)
并且在破坏者中它被重置清除。
这是多余的。隐式生成的析构函数就足够了。
这是否有任何原因导致这种开销?
可能。不必要。取决于使用动态分配的原因。
为什么不使用“普通”成员变量。
可能有原因。不可能在没有关于类的定义或用法的提示时说出这些原因。