gpt4 book ai didi

c++ - 处理数组时 make_unique 和 make_shared 之间的区别

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:06:52 50 4
gpt4 key购买 nike

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

最佳答案

What prevented the standard maker people to let make_shared support array types [...]?

可能什么都没有,根本没有考虑这种情况,类似于 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; });

因此将正确的内存清理委托(delegate)给对象创建点。这使得将原始数组视为 std::shared_ptr 实例的特例变得容易。

关于c++ - 处理数组时 make_unique 和 make_shared 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52095382/

50 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com