带有释放器的 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_views?您可以将其包装在一些自定义类型中,以保存 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&lt;char, decltype(&amp;std::free)&gt; cs(get_c_string(), std::free); 变成std::unique_ptr&lt;char&gt; cs(get_c_string(), std::free); 甚至std::unique_ptr cs(get_c_string(), std::free); @Zereges std::unique_ptr... 没有类模板参数推导......即使有,你建议的第一件事也行不通,因为从来没有任何部分类模板参数推导。跨度> 在 C++ 中很难将 unique_ptr&lt;char*&gt; 用作字符串。您至少需要创建一个string_view 才能使用它,如果您想更改所有权,您需要传递两者。虽然如果你把它改成unique_ptr&lt;char[], decltype(std::free)&gt;,效果会更好。

以上是关于带有释放器的 string_view的主要内容,如果未能解决你的问题,请参考以下文章

带有新编解码器的桌面视频播放器[关闭]

Android YouTubePlayer 在播放器顶部带有未经授权的覆盖

使用带有自定义释放器的 std::unique_ptr 来包装原始指针

带有 VST 效果插件的网络音频播放器?

带有自定义按钮的 HTML5 视频播放器无法在全屏模式下工作

带有 YouTube 视频链接的视频播放器,用于颤振应用