在std :: vector :: reserve safe之后访问原始指针?

lar*_*moa 6 c++ stl vector

这是相当牵强的,但以下代码是"安全的"(即保证不会导致分段错误):

std::vector<int> vec(1); // Ensures that &vec[0] is valid
vec.reserve(100);
memset(&vec[0], 0x123, sizeof(int)*100); // Safe?
Run Code Online (Sandbox Code Playgroud)

我意识到这很难看 - 我只想知道它是否技术上安全,而不是"漂亮".我猜它唯一的用法可能是忽略存储在给定索引之外的值.

注意!如何获取vector :: reserve()分配的缓冲区地址?涵盖相同的主题,但我更感兴趣的是,如果这是安全的,如果有这样的陷阱.

编辑:原代码是错误的,取代原来memcpymemset.

Bo *_*son 17

不,这不安全.

在a之后reserve(),保证向量不会在capacity()到达之前重新分配存储.

然而,标准不说什么载体实现可以与之间的存储做size()capacity().也许它可以用于一些内部数据 - 谁知道?也许地址空间只是保留而没有映射到实际的RAM?

访问[0..size]之外的元素是未定义的行为.有可能是一些硬件检查.