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
,效果会稍微好一点。