c++ - 在 std::string::end() 和 std::string::capacity() 之间使用缓冲区

标签 c++ string

假设字符串的容量大于它的大小。

我可以在 std::string::end()std::string::capacity() 之间使用(读/写)缓冲区吗?

更新。我问关于改变 end() 位置本身的尾随 \0

最佳答案

如果您想保持 std::string 的不变性,则不能这样做。有几种方法可以从 std::string 本身获取数据,但没有一种方法可以让您合法访问“死角”。 std::string::operator[] 仅对 [0, size()] 有效,因此您不能使用它。 std::string::at 仅对 [0, size() - 1] 有效,因此您也不能使用它。您可以使用 data()/c_str() 获取指向数据的指针,但像 operator[] 一样,访问 [0, size() 是合法的]

您可以合法地使用获取整个缓冲区指针的唯一方法是使用 &string_var[0] 然后您可以写入 [&string_var[0] 中的任何索引, &string_var[0] + capacity()).这可能会导致问题。在 string[size()] 中,我们保证有一个空终止符,如果您覆盖它,您将破坏 std::strings 不变量,这是未定义的行为,所有的赌注都关闭了。我们也不保证您放入该空间的任何东西都会留在那里。因为你不应该在那个空间玩 std::string 被允许在那里做任何它想做的事情。它可以将它用作事物本身的缓冲区,并可能会覆盖您的数据,或者假定存在的就是它放在那里的,然后您又破坏了它的不变性。

长话短说:是的,你可以,但你真的不应该。

关于c++ - 在 std::string::end() 和 std::string::capacity() 之间使用缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58323311/

相关文章:

c++ - 当一个已经存在的指针被压入堆栈时,它的拷贝是否被创建?

c++ - 第二次将 map 插入 vector 失败

string - 如何将字符串转换为在 Go 中使用给定字符集编译的字节数组?

sql - 如何在 PostgreSQL 字符串中的单引号后添加分号?

java - 如何在达到特定字符时分割字符列表并将其存储为java中的字符串

java - JUnit 测试静态 void 方法

c++ - QWidget::grab 视频功能:无法捕捉

c++ - 映射动态纹理导致 "Already Mapped Error"

c++ - 堆/堆栈上的类成员分配?

C++ 字符串函数返回语句