处理数组时make_unique和make_shared之间的差异

时间:2018-08-30 10:59:55

标签: c++ smart-pointers make-shared

从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支持数组类型?

1 个答案:

答案 0 :(得分:2)

  

是什么使标准制定者无法让make_shared支持数组类型[...]?

可能什么也没有,根本没有考虑这种情况,类似于std::make_unique在C ++ 11中不存在,但在C ++ 14中增加了。正如评论中指出的那样,此缺失的部分将随C ++ 20一起提供。

std::unique_ptrstd::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; }); 实例的特例很容易。