将 shared_ptr 与 char\* 一起使用

新手上路,请多包涵

我无法创建:

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

我该如何创建

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

使用现代指针?

原文由 Person.Junkie 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

shared_ptr n_char = makeshared(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 的结构,将在其中添加一个间接级别否则使用起来更方便。

原文由 Jan Hudec 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

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

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

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

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

原文由 unexpectedvalue 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题