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



我正在使用一个库,该库返回动态分配的以null结尾的字符串

const char* dynamically_allocated_string();

所以我负责稍后对返回的值调用CCD_ 1。我的第一直觉是将值封装在unique_ptr中,这样所有的内存管理都会自动完成:

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

如果我想从中生成std::string,我可以将字符串构造函数调用为

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

但是,这会复制现有字符串来构造std::string。有没有办法同时进行

  1. std::string包装动态分配的字符串,以便当字符串超出范围时,底层数组自动为deleted
  2. 在构造std::string时避免复制原始字符串

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

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

一种选择是为填充缓冲区的函数提供一个超大的delete0缓冲区(如果有这样的接口(,然后将该字符串修剪为实际大小。

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

最新更新