请考虑以下代码:
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)的最佳方法是什么?
答案 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代码也完全有效。