这是很牵强的,但是下面的代码是“安全的”(即保证不会引起段错误):
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
。 最佳答案
不,这不安全。
在reserve()
之后,保证在达到capacity()
之前, vector 不会重新分配存储。
但是,该标准没有说明 vector 实现可以对size()
和capacity()
之间的存储进行处理。也许它可以用于一些内部数据-谁知道?也许地址空间只是保留而没有映射到实际的RAM?
访问[0..size)之外的元素是未定义的行为。可能需要进行一些硬件检查。
关于c++ - 在std::vector::reserve之后访问原始指针是否安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8228072/