我无法创建:
shared_ptr<char> n_char = make_shared<char>(new char[size_]{});
我该如何创建
char* chr = new char[size_]{};
使用现代指针?
原文由 Person.Junkie 发布,翻译遵循 CC BY-SA 4.0 许可协议
我无法创建:
shared_ptr<char> n_char = make_shared<char>(new char[size_]{});
我该如何创建
char* chr = new char[size_]{};
使用现代指针?
原文由 Person.Junkie 发布,翻译遵循 CC BY-SA 4.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 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答3.3k 阅读
make_shared
调用new
在里面,所以你永远不要同时使用两者。在这种情况下,您只需调用new
,因为make_shared
不适用于数组。但是,您仍然需要让它调用正确的删除:
在 C++17 之前:
您需要明确指定删除器。
从 C++17 开始:
shared_ptr
获得类似于unique_ptr
从一开始就已经拥有的数组支持:请注意,以这种简单的方式完成您不会跟踪长度并且在多线程环境中不会同步。如果您需要可修改缓冲区,则将共享指针设为
std::string
或带有std::string
和std::mutex
的结构,将在其中添加一个间接级别否则使用起来更方便。