c++ - 在 std::string::end() 和 std::string::capacity() 之间使用缓冲区
问题描述
假设字符串的容量大于它的大小。
我可以在std::string::end()
和之间使用(读/写)缓冲区std::string::capacity()
吗?
UPD。我问的不是改变头寸本身的尾随\0
。end()
解决方案
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
里玩,所以你可以在那里做任何它想做的事情。它可以将其用作事物本身的缓冲区,并可能覆盖您的数据,或者假设它放在那里的是什么,然后您又破坏了它的不变性。
长话短说:是的,你可以,但你真的不应该。
推荐阅读
- neo4j - 如何处理 Neo4j 中的每个 allShortestPaths?
- asp.net - 如何为 Sharepoint 2019 站点本地项目设置权限
- arrays - 使用小数组从大数组创建新数组以选择值 numpy
- php - Firebase 无法从 php 接收通知
- reactjs - 将 Gatsby 网站转换为 WordPress 的 WebFlow?
- c# - 如何有一个动作来支持表单数据和正文中的 JSON?
- javascript - 带有存储的对象内的数组
- pytorch - 如何在 PyTorch 中与另一个数据加载器一起采样
- angular - 角度合并/加入/组合两个订阅
- ada - Ada on the microbit:滚动文本示例不起作用,找不到 libusb 库