检查string_view是否不会超过其字符串对象

时间:2016-02-02 15:31:59

标签: c++ c++11

我有一个std::string类,旨在成为struct string_view { /* implicit */ string_view(const std::string& s) : ptr_(s.c_str()), size_(s.size()) {} // other ctors... const char* ptr_; size_t size_; }; 的替代品:

void f(string_view sv);
f(std::to_string(123));

然而,虽然可以写

string_view

string_view g(string_view sv) { return sv; } string_view sv = g(std::to_string(123)); sv[0]; 不能超过临时字符串对象,它会导致UB(使用后免费)

string_view sv = std::to_string(123);
sv[0];

UB的另一个案例:

pwd

有没有办法在编译时捕获这样的错误? (除了Clang插件)。

1 个答案:

答案 0 :(得分:1)

将它们视为非托管非拥有指针或引用(没有引用生命周期扩展),因为它们就是这样。

就像非托管指针和引用一样,程序员负责生命周期管理。

如果您愿意使用不可变的牛字符串而不是std::string作为基线字符串,您可以编写引用计数string_view,以确保它们的源字符串比它们更长(在运行时)。通过一些工作,你甚至可以添加自动碎片(当原始源字符串的不到X%保持“活着”时,开始拆除它)。

(牛=写的副本)。

基本的不可变牛字符串使用指向const std字符串的共享指针,并将大多数std字符串复制为只读API。

要写入牛字符串,请调用.extract(),它返回一个可写std::string(一个副本,或者如果通过移动牛字符串是唯一的)。

您写入std::string,修改它,然后将其分配回牛字符串。

然后使用视图概念扩充牛字符串,它可以表示缓冲区的子集。接下来,添加系统以在仅引用一小部分时自动分段大缓冲区(这部分很棘手,尤其是线程安全并处理1兆字符串的情况,其中有一百万个牛字符串都访问前10个字节)。

此方法为您提供“安全”字符串和字符串视图。