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

And*_*ndy 2 c++ raii vector

考虑以下代码:

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

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

Ker*_* SB 5

v.front()无论什么时候调用都是未定义的行为v.empty().v[n]除非是调用未定义的行为n < v.size().此外,保留的内存中没有对象,因此您不能将内存视为对象.矢量只有guranatees

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

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

  • 请不要在向量中有一个元素因此它不是空的. (4认同)
  • 请注意我不在矢量上调用[]. (3认同)
  • @Andy:目前标准库中没有任何容器用于未初始化的存储.有一些辅助算法(例如`std :: uninitizlied_fill`),但没有容器.如果您需要,请自己编写. (2认同)