我有一个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插件)。
答案 0 :(得分:1)
将它们视为非托管非拥有指针或引用(没有引用生命周期扩展),因为它们就是这样。
就像非托管指针和引用一样,程序员负责生命周期管理。
如果您愿意使用不可变的牛字符串而不是std::string
作为基线字符串,您可以编写引用计数string_view
,以确保它们的源字符串比它们更长(在运行时)。通过一些工作,你甚至可以添加自动碎片(当原始源字符串的不到X%保持“活着”时,开始拆除它)。
(牛=写的副本)。
基本的不可变牛字符串使用指向const std字符串的共享指针,并将大多数std字符串复制为只读API。
要写入牛字符串,请调用.extract()
,它返回一个可写std::string
(一个副本,或者如果通过移动牛字符串是唯一的)。
您写入std::string
,修改它,然后将其分配回牛字符串。
然后使用视图概念扩充牛字符串,它可以表示缓冲区的子集。接下来,添加系统以在仅引用一小部分时自动分段大缓冲区(这部分很棘手,尤其是线程安全并处理1兆字符串的情况,其中有一百万个牛字符串都访问前10个字节)。
此方法为您提供“安全”字符串和字符串视图。