将shared_ptr与char*一起使用

Per*_*kie 6 c++ c++11

我不能创造:

shared_ptr<char> n_char = make_shared<char>(new char[size_]{});
Run Code Online (Sandbox Code Playgroud)

我该怎么创造

char* chr = new char[size_]{}; 
Run Code Online (Sandbox Code Playgroud)

用现代指针?

Jan*_*dec 13

shared_ptr n_char = make_shared(new char [size _] {});

make_sharednew内部调用,所以你永远不要同时使用它们 在这种情况下,您只能调用new,因为make_shared不适用于数组.

但是,您仍然需要调用正确的删除:

在C++ 17之前:

您需要明确指定删除器.

std::shared_ptr<char> ptr(new char[size_], std::default_delete<char[]>());
Run Code Online (Sandbox Code Playgroud)

从C++ 17开始:

shared_ptr获得类似于unique_ptr从一开始就拥有的数组支持:

std::shared_ptr<char[]> ptr(new char[size_]);
Run Code Online (Sandbox Code Playgroud)

请注意,以这种简单的方式完成您不跟踪长度并且在多线程环境中不进行同步.如果您需要的缓冲区修改,使得共享指针std::string,或结构用std::string,并std::mutex在里面,将增加一个间接的水平,但会使用,否则更方便.


une*_*lue 5

您可以使用std::default_delete专用于数组

std::shared_ptr<char> ptr(new char[size_], std::default_delete<char[]>());
Run Code Online (Sandbox Code Playgroud)

请参阅std::default_delete 文档。当没有指定其他删除器并且具有处理数组类型的部分特化时, std::unique_ptr 默认使用 default_delete :

std::unique_ptr<char[]> ptr(new char[size_]);
Run Code Online (Sandbox Code Playgroud)

使用 std::shared_ptr 您需要通过将删除器传递给构造函数来手动选择它。

编辑:感谢 Jan Hudec, c++17还包含数组类型的部分特化:

std::shared_ptr<char[]> ptr(new char[size_]);  // c++17
Run Code Online (Sandbox Code Playgroud)