我无法创建:
shared_ptr<char> n_char = make_shared<char>(new char[size_]{});
如何创建
char* chr = new char[size_]{};
使用现代指针?
答案 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::string
和std::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 ) );