Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带deallocator的字符串视图_C++_C++17_String View - Fatal编程技术网

C++ 带deallocator的字符串视图

C++ 带deallocator的字符串视图,c++,c++17,string-view,C++,C++17,String View,我试图尽可能多地使用std::string\u view来包装C-string,但是,每当动态分配我包装的C-string时,我都依赖于以下模式: char *cs = get_c_string(); std::string s(cs); free(cs); 这是浪费时间,因为它涉及1次分配、1次复制和1次释放 有没有更好的办法?或者我需要编写自己的string\u视图wrapper吗?string\u视图没有任何所有权语义。如果您想拥有它,请使用智能指针 std::unique_ptr<

我试图尽可能多地使用
std::string\u view
来包装C-string,但是,每当动态分配我包装的C-string时,我都依赖于以下模式:

char *cs = get_c_string();
std::string s(cs);
free(cs);
这是浪费时间,因为它涉及1次分配、1次复制和1次释放


有没有更好的办法?或者我需要编写自己的
string\u视图
wrapper吗?

string\u视图
没有任何所有权语义。如果您想拥有它,请使用智能指针

std::unique_ptr<char, decltype(&std::free)> cs(get_c_string(), std::free);
std::unique_ptr cs(get_c_string(),std::free);
或:

模板
结构函数删除器{
模板
void运算符()(P*P)常量{Deleter(P);}
};
std::unique_ptr cs(get_c_string());

字符串视图
没有任何所有权语义。如果您想拥有它,请使用智能指针

std::unique_ptr<char, decltype(&std::free)> cs(get_c_string(), std::free);
std::unique_ptr cs(get_c_string(),std::free);
或:

模板
结构函数删除器{
模板
void运算符()(P*P)常量{Deleter(P);}
};
std::unique_ptr cs(get_c_string());

如何处理
字符串视图后面的内存所有权完全取决于您。这就是该类型的全部要点;获取它的代码不关心它是如何拥有的。如何使用
唯一的\u ptr
和自定义删除器管理字符串的生存期,并根据需要从中创建
字符串视图
s?您可以将其封装为某种自定义类型,以节省c字符串的长度,从而避免每次创建
string\u视图时都必须计算它。
。您知道OP使用的是什么c库吗?也许这不是一种好的风格,但这并不意味着它很少出现在他们的代码库中。如何处理
string\u视图
后面的内存所有权完全取决于你。这就是该类型的全部要点;获取它的代码不关心它是如何拥有的。如何使用
唯一的\u ptr
和自定义删除器管理字符串的生存期,并根据需要从中创建
字符串视图
s?您可以将其封装为某种自定义类型,以节省c字符串的长度,从而避免每次创建
string\u视图时都必须计算它。
。您知道OP使用的是什么c库吗?也许这不是一种好的风格,但这并不意味着它很少出现在他们的代码库中。既然我们谈论的是什么?
std::unique_ptr cs(get_c_string(),std::free),就不能推断出
std::free
的类型吗进入
std::unique\u ptr cs(获取字符串(),std::free)甚至
std::unique_ptr cs(get_c_string(),std::free)
@Zereges对于
std::unique\u ptr
。。。即使有,你建议的第一件事也不会起作用,因为从来没有任何部分类模板参数推导。很难将一个<代码> UNQuyYPPTR <代码>作为C++中的一个字符串。您至少需要创建一个
string\u视图
,以使其可用,如果您想更改所有权,则需要将两者都传递给用户。虽然如果您将其改为
unique_ptr
会稍微好一些。既然我们谈论的是来自什么的?@Zereges?
std::unique_ptr cs(get_c_string(),std::free),就不能推断出
std::free
的类型吗进入
std::unique\u ptr cs(获取字符串(),std::free)甚至
std::unique_ptr cs(get_c_string(),std::free)
@Zereges对于
std::unique\u ptr
。。。即使有,你建议的第一件事也不会起作用,因为从来没有任何部分类模板参数推导。很难将一个<代码> UNQuyYPPTR <代码>作为C++中的一个字符串。您至少需要创建一个
string\u视图
,以使其可用,如果您想更改所有权,则需要将两者都传递给用户。尽管如果您将其改为
唯一的\u ptr
,效果会稍微好一点。