带有释放器的 string_view
Posted
技术标签:
【中文标题】带有释放器的 string_view【英文标题】:string_view with a deallocator 【发布时间】:2017-10-03 18:04:06 【问题描述】:我正在尝试尽可能多地使用 std::string_view
来包装 C 字符串,但是,每当我要包装的 C 字符串是动态分配的时,我都依赖于这种模式:
char *cs = get_c_string();
std::string s(cs);
free(cs);
这是浪费时间,因为它涉及 1 次分配、1 次复制和 1 次释放。
有没有办法更好地做到这一点?还是我需要编写自己的string_view
包装器?
【问题讨论】:
如何处理string_view
背后的内存所有权完全取决于您。这就是类型的全部意义。获取它的代码并不关心它是如何拥有的。
如何使用unique_ptr
和自定义删除器管理字符串的生命周期,并根据需要从中创建string_view
s?您可以将其包装在一些自定义类型中,以保存 c 字符串的长度,以避免每次创建 string_view
时都必须计算它。
每当也称为很少。
@manni66 你知道 OP 使用了哪些 C 库吗?也许这不是很好的风格,但这并不意味着它很少出现在他们的代码库中。
【参考方案1】:
string_view
没有任何任何所有权语义。如果您想拥有它,请使用智能指针。
std::unique_ptr<char, decltype(&std::free)> cs(get_c_string(), std::free);
或者:
template <auto Deleter>
struct FuncDeleter
template <class P>
void operator()(P* p) const Deleter(p);
;
std::unique_ptr<char, FuncDeleter<std::free>> cs(get_c_string());
【讨论】:
不能推断std::free
的类型,因为我们在谈论c++1z?
@Zereges 从何而来?
std::unique_ptr<char, decltype(&std::free)> cs(get_c_string(), std::free);
变成std::unique_ptr<char> cs(get_c_string(), std::free);
甚至std::unique_ptr cs(get_c_string(), std::free);
@Zereges std::unique_ptr
... 没有类模板参数推导......即使有,你建议的第一件事也行不通,因为从来没有任何部分类模板参数推导。跨度>
在 C++ 中很难将 unique_ptr<char*>
用作字符串。您至少需要创建一个string_view
才能使用它,如果您想更改所有权,您需要传递两者。虽然如果你把它改成unique_ptr<char[], decltype(std::free)>
,效果会更好。以上是关于带有释放器的 string_view的主要内容,如果未能解决你的问题,请参考以下文章
Android YouTubePlayer 在播放器顶部带有未经授权的覆盖
使用带有自定义释放器的 std::unique_ptr 来包装原始指针