gpt4 book ai didi

C++11 : Why array with shared_ptr can not be deleted by default

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:53 25 4
gpt4 key购买 nike

阅读:C++ 标准库 - 教程和引用

我遇到了以下片段:

Note that the default deleter provided by shared_ptr calls delete, not delete[]. This means that the default deleter is appropriate only if a shared pointer owns a single object created with new. Unfortunately, creating a shared_ptr for an array is possible but wrong:

std::shared_ptr<int> p(new int[10]); // ERROR, but compiles

So, if you use new[] to create an array of objects you have to define your own deleter. You can do that by passing a function, function object, or lambda, which calls delete[ ] for the passed ordinary pointer. For example:

std::shared_ptr<int> p(new int[10],
[](int* p) {
delete[] p;
});

此限制背后是否有任何特定原因?如果共享指针很聪明,那么它保留信息(无论是数组还是单个对象)不是很聪明吗?

虽然有一种方法可以做到这一点:

std::shared_ptr<int> p(new int[10], std::default_delete<int[]>());

最佳答案

问题是 new int[10]new int返回相同类型:int* ,所以没有什么可以做任何重载。这是从 C 继承的限制,对此无能为力。

不过,通常您只会使用容器而不是直接分配,所以这通常不是问题。

编辑:如 Richard 所说,并如 this question 中所述, std::shared_ptr<int[]> 似乎是明智的会随心所欲,因为std::unique_ptr具有类似的重载,并存储指向 int[] 的实际指针会有点多余(无论如何,如果您真的想要的话,您可以使用 std::shared_ptr<int*>)。

我仍然认为使用 default_deleter<int[]>是最好的方式。

关于C++11 : Why array with shared_ptr can not be deleted by default,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41058824/

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