使用char使用的shared_ptr *

问题描述:

我不能创建:使用char使用的shared_ptr *

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

如何用现代指针创建

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

+1

顺便说一下,你最好使用'std :: string'或'std :: vector '代替。 – Slava

+0

@Slava,好吧,那些相当于'std :: unique_ptr '。 'std :: string'曾经是标准库的一些版本中的共享和写入时拷贝,但事实证明它不适用于某些情况,所以它现在总是在下面有一个唯一的指针。如果你想共享,你需要自己做(并小心修改)。 –

+0

@JanHudec如果你需要共享所有权然后使用'std :: shared_ptr >'或'std :: shared_ptr >',因为你必须跟踪缓冲区大小。 – Slava

的shared_ptr n_char = make_shared(新的char [大小_] {});

make_shared呼叫new里面,所以你永远不会使用两个。在这种情况下,您只能拨打new,因为make_shared不适用于阵列。

不过,你仍然需要使它调用正确的删除:

之前C++ 17

您需要明确指定缺失者。

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

由于C++ 17

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

要知道,这样做简单的方法:类似于unique_ptr已经从起初

shared_ptr收益阵列支持你没有跟踪长度,并且在多线程环境中没有同步。如果你需要缓冲区可修改,使共享指针std::string或结构std::stringstd::mutex,将增加一个间接的级别,但会更方便使用。

+1

其实,'make_shared' _is_是'new'的包装。术语“包装器”通常意味着包装函数具有一个调用包装函数的实现,而'make_shared'实际上调用'new'。这就是为什么你不要传递'new char []'作为参数,这将是第二次调用'new'。 – MSalters

+0

@ MSalters,好的,重写以避免这个词。 –

+0

is this'shared_ptr var(new char [size_] {},std :: default_delete ());'correct form? –

你可以使用std::default_delete专门用于阵列

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

std::default_delete docs。虽然标准::的unique_ptr默认情况下,当没有指定其他缺失者使用default_delete和有处理数组类型的部分专业化:

性病:: shared_ptr的,你需要传递一个删除器的构造手动选择。

编辑:由于扬邬达克,c++17 includes a partial specialization for array types,以及:

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