【问题标题】:std::unique_ptr initialization methodsstd::unique_ptr 初始化方法
【发布时间】:2020-05-09 17:10:10
【问题描述】:

我看到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 类甚至允许上述初始化方法,而它有 std::make_unique&lt;some_class&gt;() 方法可供使用?

我错过了什么吗?

【问题讨论】:

  • 否则你会如何从原始指针构造unique_ptr? c++ 为您提供了实现程序的工具,如果您选择使用这些工具来打自己的脚,语言不会阻止您这样做
  • 另外,它部分是为了向后兼容。 std::make_unique 直到 C++14 才可用,所以会有很多程序可以使用它,但不要。
  • @AlanBirtles std::make_unique 在后台使用原始指针进行初始化,不是吗?
  • @PaulSanders 那是我不知道的。谢谢!
  • @AbhishekAUdupa 是的,与std::make_shared 不同,std::make_unique 是构造函数的简单包装,没有性能优势

标签: c++ pointers smart-pointers undefined-behavior unique-ptr


【解决方案1】:

几个原因:

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

另请注意,从 C++17 开始,优先使用 make_unique 而不是 new 的主要原因已被删除,因此您可能会将 make_unique 仅视为语法糖,而不是异常安全实用程序。见Why use std::make_unique in C++17?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 2019-11-07
    • 2021-06-23
    • 2015-04-30
    • 2016-12-30
    相关资源
    最近更新 更多