std :: vector reserve()的未定义行为

时间:2015-07-20 12:17:36

标签: c++ vector raii

请考虑以下代码:

vector<uint8_t> v(1);
v.reserve(2);
uint8_t *data = &v.front();
data[1] = 0;

是否存在未定义的行为(C ++ 98,C ++ 03,C ++ 11)? 如果是的话,获得RAII缓冲区(不使用C ++ 11)的最佳方法是什么?

2 个答案:

答案 0 :(得分:5)

只要v.front()为真,就调用v.empty()是未定义的行为。除非v[n],否则调用n < v.size()是未定义的行为。此外,保留的内存中没有对象,因此您不能将内存视为对象。一个载体只有guranatees

  

[data(), data() + size())是有效范围

并且无法保证有更大的有效范围。 (请注意data() == &front(),因此这适用于您的代码。)

答案 1 :(得分:-1)

我已经检查了C ++ 98标准。

以下是reserve()的注释:
&#34; 保证在调用reserve()之后发生的插入过程中不会发生重新分配,直到插入使向量的大小大于在指定的大小中指定的大小为止。最近调用reserve()。&#34;

并注意&#34;矢量修饰符&#34;:
&#34; 如果没有重新分配,插入点之前的所有迭代器和引用仍然有效。&#34;

因此,即使对于C ++ 98,所提出的IMHO代码也完全有效。