std::unique_ptr 初始化方法

std::unique_ptr initialization methods

我看到std::unique_ptr有以下几种初始化方式:

std::unique_ptr<some_class> sc_ptr{ new some_class };

其中有人可以从 std::unique_ptr.

下方 delete 分配的 some_class

some_class *scptr { new some_class }
std::unique_ptr<some_class> sc_ptr1{ scptr };
std::unique_ptr<some_class> sc_ptr2{ scptr };

std::unique_ptr中击败'unique'的目的并导致UDB。

现在我的问题是:为什么 std::unique_ptr class 甚至允许上述初始化方法,而它可以使用 std::make_unique<some_class>() 方法?

我是不是漏掉了什么?

几个原因:

  1. make_unique 采用自定义删除器,因此它应该处理自定义分配。将分配器传递给假设的 allocate_unique 很麻烦。
  2. .release()一样可以提供一个结点,代码以不同的方式管理生命周期(包括API在使用原始指针的C接口中)。
  3. 历史原因,make_unique 仅在 C++14 中引入。

另请注意,从 C++17 开始,首选 make_unique 而不是 new 的主要原因已被删除,因此您可能会将 make_unique 视为语法糖,而不是异常安全实用程序。参见