以拥有的方式从动态分配的 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
。有没有办法两者都
- 用
std::string
包裹一个动态分配的字符串,这样当字符串超出范围 时,底层数组自动delete
d
- 在
std::string
的构造过程中避免复制原始字符串
我知道 string_view
但它不拥有原始字符数组的所有权。
不幸的是,std::string
中没有获取外部分配缓冲区所有权的接口。
一个选项是为填充缓冲区的函数提供一个超大 std::string
缓冲区(如果有这样的接口),然后 trim 该字符串为实际大小。
否则,如果您想坚持使用 std::
组件并避免使用 allocating/copying 字符串,您最好的选择是 std::unique_ptr<const char[]>
(可能使用与分配匹配的自定义删除器函数)按需转换为 std::string_view
,正如您在问题中提到的那样。
我正在使用一个库,其中 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
。有没有办法两者都
- 用
std::string
包裹一个动态分配的字符串,这样当字符串超出范围 时,底层数组自动 - 在
std::string
的构造过程中避免复制原始字符串
delete
d
我知道 string_view
但它不拥有原始字符数组的所有权。
不幸的是,std::string
中没有获取外部分配缓冲区所有权的接口。
一个选项是为填充缓冲区的函数提供一个超大 std::string
缓冲区(如果有这样的接口),然后 trim 该字符串为实际大小。
否则,如果您想坚持使用 std::
组件并避免使用 allocating/copying 字符串,您最好的选择是 std::unique_ptr<const char[]>
(可能使用与分配匹配的自定义删除器函数)按需转换为 std::string_view
,正如您在问题中提到的那样。