从C ++ 17开始,您可以使用make_unique
来创建指向数组的智能指针,例如:
unique_ptr<int[]> ptr = make_unique<int[]>(10);
这将创建一个指向10个元素的数组的智能指针(也将调用正确的deleter []的事实也很好)。
但是根据this 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[]>
是legal),但make_shared
不支持。而make_unique
可以。
问题是,是什么导致标准制定者无法像make_shared
那样让make_unique
支持数组类型?
答案 0 :(得分:2)
是什么使标准制定者无法让make_shared支持数组类型[...]?
可能什么也没有,根本没有考虑这种情况,类似于std::make_unique
在C ++ 11中不存在,但在C ++ 14中增加了。正如评论中指出的那样,此缺失的部分将随C ++ 20一起提供。
std::unique_ptr
和std::shared_ptr
之间的区别使得忽略原始数组指针变得容易,但是:自定义删除器是std::unique_ptr
类型的一部分,而不是{{1} }的类型。因此,您可以处理这样的数组
std::shared_ptr
,因此将正确的内存清理委派给对象创建点。这使得将原始数组作为std::shared_ptr<int> array = std::shared_ptr<int>(new int[10],
[](int *ptr){ delete []ptr; });
实例的特例很容易。