为什么要在类中使用唯一指针

时间:2018-03-19 22:20:35

标签: c++ c++11

最近,我遇到了一个包含私有唯一指针成员变量的类。在构造函数中,它使用make_unique进行初始化,并在析构函数中使用reset进行清除。我知道make_unique执行堆分配。有这个开销的原因吗?为什么不使用"正常"成员变量。

2 个答案:

答案 0 :(得分:4)

制作类的unique_ptr成员变量有几个正当理由。没有看到课程,我不能说哪个,如果有的话;正如我在评论中写的那样,在析构函数中明确地调用reset似乎非常糟糕,所以我认为我不会给作者带来疑问。

以下是我能想到的一些原因:

  1. 有问题的对象是运行时多态。也就是说,您有一个unique_ptr<Base>,实际上您可以指向Derived
  2. 你希望你的班级可以移动,但是有问题的成员是不可移动的,或者因为某种原因“糟透了”。这与std::mutex有很大关系;作为一个变量变量,这是非常尴尬的。在17中,可以从函数返回不可移动的对象,因此它们并没有那么糟糕。但是在14或之前,不可移动的物体真的很刺激。因此,您的对象可以保持unique_ptr<mutex>而仍然可以移动。这种类型的移动成本很高(有大量成员的结构)或者不遵守适当的异常安全保证(但这很少有效恕我直言)。
  3. 您真的想要回收与该类型相关联的内存。我也见过这种情况,有时候你在初始化过程中会做很多复杂的配置,以后你就不需要了。如果你有一个unique_ptr<InitInfo>或类似的东西,你可以调用reset,这样一旦你的程序启动并运行在长期运行的关键部分中,你就会返回大量的内存。
  4. 使用unique_ptr的一个不错但常见的原因是推迟初始化,即你需要构建一个比对象更晚构造的成员。这通常很糟糕,但即使您需要这样做,也可以使用optional

答案 1 :(得分:1)

  

并且在破坏者中它被重置清除。

这是多余的。隐式生成的析构函数就足够了。

  

这是否有任何原因导致这种开销?

可能。不必要。取决于使用动态分配的原因。

  

为什么不使用“普通”成员变量。

可能有原因。不可能在没有关于类的定义或用法的提示时说出这些原因。