c++ - make_unique 和 make_shared 处理数组时的区别
问题描述
从 C++17 开始,您可以使用make_unique
它来创建指向数组的智能指针,例如:
unique_ptr<int[]> ptr = make_unique<int[]>(10);
这将创建一个指向 10 个元素的数组的智能指针(正确的 deleter[] 将被调用的事实也很棒)。
但是据此不 make_shared
支持此类功能(据我了解,至少在 C++17 中不支持):
shared_ptr<int[]> ptr = make_shared<int[]>(10);
上面的代码显然是非法的。事实上,我的 Visual Studio 2017 (v141) 吐出以下错误:
C2070: 'int[]': illegal sizeof operand'
有趣的是它shared_ptr
本身确实支持数组类型(即合法),但shared_ptr<int[]>
不支持。而确实如此。make_shared
make_unique
问题是,是什么阻止了标准制定者让make_shared
支持数组类型,就像make_unique
?
解决方案
是什么阻止了标准制定者让 make_shared 支持数组类型 [...]?
可能没什么,根本没有考虑这种情况,类似于std::make_unique
在 C++11 中不存在但在 C++14 中添加。正如评论中所指出的,这个缺失的部分将随 C++20 一起提供。
但是,两者之间存在差异std::unique_ptr
,std::shared_ptr
这使得忽略原始数组指针变得容易:自定义删除器是std::unique_ptr
' 类型的一部分,但不是std::shared_ptr
' 类型的一部分。因此,您可以像这样处理数组
std::shared_ptr<int> array = std::shared_ptr<int>(new int[10],
[](int *ptr){ delete []ptr; });
因此将正确的内存清理委托给对象创建点。这使得将原始数组视为std::shared_ptr
实例的特殊情况变得容易。
推荐阅读
- javascript - django 在 POST 请求后不呈现
- java - 动画淡入淡出不起作用
- java - 在窗口任务栏缩略图预览中显示按钮 - Java
- ios - 是否可以在不窥视的情况下添加 3D 触摸?
- linux - 在字符串中找到模式后评论 bash 行
- arcgis-js-api - 带有 graphicsLayer 的 UniqueValueRenderer
- r - plotly 使用 ggplot 和 shiny 的所有功能来创建一个非常互动的情节
- mysql - 根据特定条件SQL计算每组的百分比贡献
- wireshark - 转换后的 pcap 文件无法在 veloview 中加载
- testing - 在邮递员中循环发布请求