首页 > 解决方案 > 在 std::string::end() 和 std::string::capacity() 之间使用缓冲区

问题描述

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

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

UPD。我问的不是改变头寸本身的尾随\0end()

标签: c++string

解决方案


std::string如果你想保持's 的不变性,你不能这样做。有几种方法可以从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里玩,所以你可以在那里做任何它想做的事情。它可以将其用作事物本身的缓冲区,并可能覆盖您的数据,或者假设它放在那里的是什么,然后您又破坏了它的不变性。

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


推荐阅读