gpt4 book ai didi

c++ - 正确声明智能指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:40 24 4
gpt4 key购买 nike

我对此有点困惑:

int *pointer = new int[100];    // Yes
int array [] = new int[100]; // No

但是:

unique_ptr<int*> pointer { new int[100] };    // No
unique_ptr<int[]> array { new int[100] }; // Yes

谁能解释一下这里涉及的一般原则。我不完全理解为什么智能指针语义似乎与常规原始指针相反。

最佳答案

智能指针是库代码,所以它们的工作方式是因为有人以这种方式设计了它们。

在您的第一个 naked-array-new 代码中,第二行在语法上没有意义,因为您不能使用指针初始化数组,并且 new返回一个指针。

unique_ptr例子也是错误的;更正后的版本更有意义:

//               +--------------+------------ pointer to int
// V V
std::unique_ptr<int> p { new int; }
std::unique_ptr<int[]> p { new int[10]; }
// ^ ^
// +----------------+---------- pointer to first element
// of an array of int

找到规律了吗?

您需要不同模板特化的原因是您需要调用 deletedelete[]在指针上取决于它是如何分配的,但你不能仅仅通过查看原始指针来判断。 (此外,数组版本提供了一个方便的 [] 运算符。)

没有什么能阻止你混合 unique_ptr<int>new int[10] ,但它或多或少是一个导致无声未定义行为的微妙错误(另一个永远不要自己使用 new 而是依赖 make_unique 的原因!)。相比之下,您的第一个示例是一个简单的语法错误。

关于c++ - 正确声明智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18543315/

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