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

Wer*_*ner -1 c++ c++11

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

Nir*_*man 5

创建类的unique_ptr成员变量有几个正当理由。如果没有看到课程,我无法说出哪个适用;正如我在评论中所写的那样reset,在析构函数中明确调用似乎非常糟糕,所以我认为我不会让作者受益。

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

  1. 有问题的对象是运行时多态的。也就是说,您有 aunique_ptr<Base>并且您实际上可以指向 a Derived
  2. 你希望你的班级是可移动的,但有问题的成员是不可移动的,或者由于某种原因“很难”移动。这出现了很多std::mutex; 作为成员变量非常尴尬。在 17 中,不可移动的对象可以从函数中返回,因此它们并没有那么糟糕。但是在 14 或之前,不可移动的物体真的很烦人。所以你的对象可以容纳一个unique_ptr<mutex>而仍然是可移动的。这种变体是移动昂贵的类型(具有大量成员的结构)或不遵守适当的异常安全保证(但这很少是有效的恕我直言)。
  3. 您确实想回收与该类型关联的内存。我也见过这种情况,有时您在初始化期间会进行大量复杂的配置,稍后您就不需要了。如果你有一个unique_ptr<InitInfo>或类似的东西,你可以调用,reset这样一旦你的程序在长时间运行的性能关键部分启动并运行,你就返回了大量内存。

一个不好但常见的使用原因unique_ptr是推迟初始化,即您需要在构造一个整体的对象之后构造一个成员。这通常很糟糕,但即使您需要这样做,您也可以使用optional.