c++ - 为什么在 C++17 中使用 std::make_unique?
问题描述
据我了解,引入 C++14 是std::make_unique
因为由于未指定参数评估顺序,这是不安全的:
f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A
(解释:如果评估首先为原始指针分配内存,然后调用g()
并在std::unique_ptr
,则内存泄漏。)
调用std::make_unique
是一种限制调用顺序的方法,从而使事情变得安全:
f(std::make_unique<MyClass>(param), g()); // Syntax B
从那时起,C++17 已经明确了评估顺序,使得语法 A 也安全,所以这是我的问题:还有理由在 C++17 中使用std::make_unique
overstd::unique_ptr
的构造函数吗?你能举一些例子吗?
到目前为止,我能想象的唯一原因是它只允许输入MyClass
一次(假设您不需要依赖多态性std::unique_ptr<Base>(new Derived(param))
)。但是,这似乎是一个非常薄弱的理由,尤其是当' 的构造函数std::make_unique
不允许指定删除器时。std::unique_ptr
为了清楚起见,我并不是主张std::make_unique
从标准库中删除(至少为了向后兼容而保持它是有意义的),而是想知道是否仍然存在强烈首选它的情况std::unique_ptr
解决方案
你是对的,主要原因被删除了。仍然有不使用新准则和减少打字的原因(不必重复打字或使用单词new
)。诚然,这些不是强有力的论据,但我真的很喜欢new
在我的代码中看不到。
也不要忘记一致性。你绝对应该使用make_shared
所以使用make_unique
是自然的并且符合模式。然后更改std::make_unique<MyClass>(param)
为std::make_shared<MyClass>(param)
(或相反)语法 A 需要更多重写的地方是微不足道的。
推荐阅读
- json - 在 IIB 中使用 swagger 验证 JSON 输入消息
- arrays - 在 char[][] 中添加像 '☯' 这样的字符会将所有内容推到右侧
- php - PHP - 在 Google Chrome 中的 ics 文件上获取“[文件名] 通常不被下载并且可能很危险”警报
- gradle - 如何使用由 kotlin multiplatform 创建的 Javascript 工件
- javascript - 如何使用 Mocha 在 Visual Studio Code 中设置测试文件夹的目录?
- xamarin - Xamarin Forms:如何通过属性名称获取 BindableProperty?
- css - 如何使固定定位的元素溢出y轴时滚动?
- gitlab-omnibus - Gitlab Omninbus 核心:索引器设置失败并显示“无法找到 Gemfile 或 .bundle/ 目录”
- laravel - 放置在 col-4 中时提交按钮处于非活动状态,但表单在 col-8 laravel 中提交
- ngrok - x509:由未知机构签署的证书 [ ngrok ]