从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
的情况一样?
是什么阻止了标准制造者让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
实例的特例进行处理变得容易。