【发布时间】:2011-11-22 14:04:29
【问题描述】:
这有点牵强,但以下代码“安全”(即保证不会导致分段错误):
std::vector<int> vec(1); // Ensures that &vec[0] is valid
vec.reserve(100);
memset(&vec[0], 0x123, sizeof(int)*100); // Safe?
我意识到这很丑 - 我只想知道它在技术上是否安全,而不是“漂亮”。我猜它的唯一用途可能是忽略存储在给定索引之外的值。
注意! How can I get the address of the buffer allocated by vector::reserve()? 涵盖了相同的主题,但我更感兴趣的是这是否安全以及这样做是否存在陷阱。
编辑:原始代码错误,将原始 memcpy 替换为 memset。
【问题讨论】:
-
好吧,这太丑了,太疼了。你为什么这样做?如果你真的需要的话,你不能简单地使用一个数组吗?在这个例子中 100 是固定的,所以你可以在堆栈上使用一个数组,甚至不需要 delete[]ing...
-
“分段错误”是特定于平台的事件。 C++ 语言没有描述它是什么。语言只说明是否定义了某些东西,如果定义了,做什么。
-
我对这个问题投了反对票,不是因为我认为这是一个不好的问题,而是因为你没有花足够的时间来确保你问的是你想要问的(原始代码和当前版本中的代码完全不同)。 -2 代表点并不多,但应该提醒你以后要小心一点,因为当你要求其他人花时间回答试图帮助时,如果你稍后重新提出问题,那就是浪费时间开。
-
如果只考虑这里的 3 行代码,我相信我在 stackoverflow.com/questions/19064318 中的回答表明代码定义明确。