我正在使用一个库,该库返回动态分配的以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
。有没有办法同时进行
- 用
std::string
包装动态分配的字符串,以便当字符串超出范围时,底层数组自动为delete
d - 在构造
std::string
时避免复制原始字符串
我知道string_view
,但它不拥有原始字符数组的所有权。
不幸的是,std::string
中没有接口可以获得外部分配的缓冲区的所有权。
一种选择是为填充缓冲区的函数提供一个超大的delete
0缓冲区(如果有这样的接口(,然后将该字符串修剪为实际大小。
否则,如果你想坚持使用std::
组件并避免分配/复制字符串,你最好的选择是std::unique_ptr<const char[]>
(可能带有与分配函数匹配的自定义deleter(按需转换为std::string_view
,正如你在问题中提到的那样。