gpt4 book ai didi

C++17:unique_ptr 和 shared_ptr 之间指针存储的区别

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

我感到困惑的是:

unique_ptr<char[]> u_ptr = make_unique<char[]>(10);
sprint(u_ptr.get(), 10, "milos"); // get returns char*
cout << u_ptr.get(); // get returns char*

和:

shared_ptr<char[]> s_ptr = make_shared<char[]>(10);
sprint(*s_ptr.get(), 10, "milos"); // get here returns char** ?
cout << *s_ptr.get(); // get here returns char** ?

所以,虽然 unique_ptr<char[]>返回 char*对于基础数组,shared_ptr<char[]>似乎返回 char(*)[]指向数组指针的指针?我做了一些测试,我可以使用 shared_ptr<char>默认删除:

shared_ptr<char> s_ptr(new char[10], default_delete<char[]>());
sprint(s_ptr.get(), 10, "milos"); // get here returns char*, fine
cout << s_ptr.get(); // same here

但我猜测 C++17 背后的想法不是 shared_ptr<char> 的方法。和自定义指定删除器:default_delete<char[]>因为在 C++17 之前这是可能的。

有人可以澄清正确的用法,以及为什么会出现以下情况:

unique_ptr<int> u = make_unique<int>(5);
auto iu = u.get(); // iu is typeof int*

同时

unique_ptr<int[]> ua = make_unique<int[]>(5);
auto iua = ua.get(); // iua is still typeof int* ?

对于 shared_ptr:

shared_ptr<int> s = make_shared<int>(5);
auto is = s.get(); // is is typeof int*

但是

shared_ptr<int[]> sa = make_shared<int[]>(5);
auto isa = sa.get(); // isa is typeof int** ???

.

最佳答案

std::unique_ptr当 T 是数组类型时具有特定的特化。这会导致选择正确的默认删除器。

无论好坏,std::shared_ptr不(而 std::make_shared 从 c++20 开始)。

您在 shared_ptr 中看到的行为,作为调用 get() 的结果返回 T** 是一个已在 c++17 中修复的异常(它现在将返回 T*)。

这是因为直到 c++17,std::shared_ptr::element_typeTstd::shared_ptr::get返回了 T* .

截至 c++17 element_type定义为 std::remove_extent_t<T>get()返回 element_type* ;

如此给出using SAI = std::shared_ptr<int[]>

在 C++14 中:

SAI::element_type = int[]

SAI::get() -> (int[])*衰减到 int**

在 C++17 中:

SAI::element_type = int

SAI::get() -> int*

供引用的文档链接:

https://en.cppreference.com/w/cpp/memory/unique_ptr https://en.cppreference.com/w/cpp/memory/shared_ptr

据我所知,在 c++17 之前创建共享数组的方法是这样的:

#include <memory>

int main()
{
auto uai = std::make_unique<int[]>(10);
std::shared_ptr<int> sai { uai.release(), uai.get_deleter() };
}

在 c++17 之后:

#include <memory>

int main()
{
std::shared_ptr<int[]> sai = std::make_unique<int[]>(10);
}

关于C++17:unique_ptr<char[]> 和 shared_ptr<char[]> 之间指针存储的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51209401/

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