以拥有的方式从动态分配的 char 数组构造 std::string

Construct `std::string` from dynamically allocated char array in an owning way

我正在使用一个库,其中 returns 一个动态分配的空终止字符串

const char* dynamically_allocated_string();

所以我负责稍后对返回值调用delete。我的第一直觉是将值包装在 unique_ptr 中,以便自动完成所有内存管理:

std::unique_ptr<const char[]> ptr{dynamically_allocated_string()};

如果我想从中创建一个 std::string,我可以将字符串构造函数调用为

std::string{ptr.get()};

但是,这会复制现有的字符串来构造std::string。有没有办法两者都

  1. std::string包裹一个动态分配的字符串,这样当字符串超出范围
  2. 时,底层数组自动deleted
  3. std::string的构造过程中避免复制原始字符串

我知道 string_view 但它不拥有原始字符数组的所有权。

不幸的是,std::string 中没有获取外部分配缓冲区所有权的接口。

一个选项是为填充缓冲区的函数提供一个超大 std::string 缓冲区(如果有这样的接口),然后 trim 该字符串为实际大小。

否则,如果您想坚持使用 std:: 组件并避免使用 allocating/copying 字符串,您最好的选择是 std::unique_ptr<const char[]>(可能使用与分配匹配的自定义删除器函数)按需转换为 std::string_view,正如您在问题中提到的那样。