gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:33:35 26 4
gpt4 key购买 nike

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

我可以在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com