【问题标题】:string_view with a deallocator带有释放器的 string_view
【发布时间】: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 库吗?也许这不是很好的风格,但这并不意味着它很少出现在他们的代码库中。

标签: c++ c++17 string-view


【解决方案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;,效果会更好。
猜你喜欢
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 2018-09-29
相关资源
最近更新 更多