【发布时间】: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<some_class>() 方法可供使用?
我错过了什么吗?
【问题讨论】:
-
否则你会如何从原始指针构造
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