使用char使用的shared_ptr *
我不能创建:使用char使用的shared_ptr *
shared_ptr<char> n_char = make_shared<char>(new char[size_]{});
如何用现代指针创建
char* chr = new char[size_]{};
?
的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::string
和std::mutex
,将增加一个间接的级别,但会更方便使用。
其实,'make_shared' _is_是'new'的包装。术语“包装器”通常意味着包装函数具有一个调用包装函数的实现,而'make_shared'实际上调用'new'。这就是为什么你不要传递'new char []'作为参数,这将是第二次调用'new'。 – MSalters
@ MSalters,好的,重写以避免这个词。 –
is this'shared_ptr
你可以使用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
顺便说一下,你最好使用'std :: string'或'std :: vector'代替。 –
Slava
@Slava,好吧,那些相当于'std :: unique_ptr'。 'std :: string'曾经是标准库的一些版本中的共享和写入时拷贝,但事实证明它不适用于某些情况,所以它现在总是在下面有一个唯一的指针。如果你想共享,你需要自己做(并小心修改)。 –
@JanHudec如果你需要共享所有权然后使用'std :: shared_ptr>'或'std :: shared_ptr >',因为你必须跟踪缓冲区大小。 –
Slava