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

问题描述 投票:4回答:1

从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的情况一样?

c++ smart-pointers make-shared
1个回答
2
投票

是什么阻止了标准制造者让make_shared支持数组类型[...]?

可能没什么,这个案例根本就没有考虑过,类似于std::make_unique没有出现在C ++ 11中但是在C ++ 14中添加了。正如评论中指出的那样,这个缺失的部分将附带C ++ 20。

std::unique_ptrstd::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实例的特例进行处理变得容易。

© www.soinside.com 2019 - 2024. All rights reserved.