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>()
方法?
我是不是漏掉了什么?
几个原因:
make_unique
采用自定义删除器,因此它应该处理自定义分配。将分配器传递给假设的 allocate_unique
很麻烦。
- 与
.release()
一样可以提供一个结点,代码以不同的方式管理生命周期(包括API在使用原始指针的C接口中)。
- 历史原因,
make_unique
仅在 C++14 中引入。
另请注意,从 C++17 开始,首选 make_unique
而不是 new 的主要原因已被删除,因此您可能会将 make_unique
视为语法糖,而不是异常安全实用程序。参见
我看到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>()
方法?
我是不是漏掉了什么?
几个原因:
make_unique
采用自定义删除器,因此它应该处理自定义分配。将分配器传递给假设的allocate_unique
很麻烦。- 与
.release()
一样可以提供一个结点,代码以不同的方式管理生命周期(包括API在使用原始指针的C接口中)。 - 历史原因,
make_unique
仅在 C++14 中引入。
另请注意,从 C++17 开始,首选 make_unique
而不是 new 的主要原因已被删除,因此您可能会将 make_unique
视为语法糖,而不是异常安全实用程序。参见