将shared_ptr与char *一起使用

时间:2017-04-26 10:21:31

标签: c++ c++11

我无法创建:

shared_ptr<char> n_char = make_shared<char>(new char[size_]{});

如何创建

char* chr = new char[size_]{}; 

使用现代指针?

3 个答案:

答案 0 :(得分:10)

  

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

make_shared在里面调用new,所以你永远不要同时使用它们。在这种情况下,您只需调用new,因为make_shared不适用于数组。

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

在C ++ 17之前

您需要明确指定删除器。

std::shared_ptr<char> ptr(new char[size_], std::default_delete<char[]>());

自C ++ 17以来

shared_ptr获得的阵列支持类似于unique_ptr从一开始就拥有的内容:

std::shared_ptr<char[]> ptr(new char[size_]);

请注意,通过这种简单的方式,您无需跟踪长度,也无法在多线程环境中进行同步。如果您需要缓冲区可修改,将共享指针指向std::string,或者在其中包含std::stringstd::mutex的结构,将添加一个间接级别,但在其他方面使用起来会更方便。

答案 1 :(得分:3)

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

std::shared_ptr<char> ptr(new char[size_], std::default_delete<char[]>());

std::default_delete docs。虽然std :: unique_ptr默认情况下使用default_delete,但没有指定其他删除器并且具有处理数组类型的部分特化:

std::unique_ptr<char[]> ptr(new char[size_]);

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

编辑:感谢Jan Hudec,c++17 includes a partial specialization for array types

std::shared_ptr<char[]> ptr(new char[size_]);  // c++17

答案 2 :(得分:-3)

对于简单的char缓冲区:

std::shared_ptr<char> ptr( (char*)operator new( buffer_size_here ) );