C++ 如果我的程序正常,STL是否会为std::vector的std::vector生成valgrind错误?

C++ 如果我的程序正常,STL是否会为std::vector的std::vector生成valgrind错误?,c++,stl,valgrind,C++,Stl,Valgrind,我在程序中使用一个向量: vector<vector<int>> vec; 现在我用valgrind检查了我的程序。Valgrind抱怨了很多: 条件跳转或移动取决于未初始化的值 似乎它们与vector::reserve有关。这个函数似乎分配未初始化的堆内存,这很有意义。实际上,当我将vec.reserve(firstDimension)替换为: for(int i = 0; i < firstDim; i ++){ vec.emplace(); // jus

我在程序中使用一个向量:

vector<vector<int>> vec;
现在我用valgrind检查了我的程序。Valgrind抱怨了很多:

条件跳转或移动取决于未初始化的值

似乎它们与
vector::reserve
有关。这个函数似乎分配未初始化的堆内存,这很有意义。实际上,当我将
vec.reserve(firstDimension)
替换为:

for(int i = 0; i < firstDim; i ++){
  vec.emplace(); // just constructs a sub-vector for the second dimension
}
for(int i=0;i

然而,我现在有点困惑:我希望STL不会产生这样的错误。因此,我想知道是否存在STL生成valgrind错误的实际情况,或者这是否表明我的程序中存在问题?

这是因为
std::vector::reserve(n)
分配了至少容纳
n
元素所需的内存,但它并不构造实际的元素。 因此,分配的内存只是垃圾,您需要
/
项插入到向量上,以实际构建内部向量

如果知道
firstDim
并希望默认构造内部向量,请使用
std::vector
的大小构造函数:

vector<vector<int>> vec(firstDim);

请注意,第一种方法是首选方法。

请给出完整的示例。
vector<vector<int>> vec(firstDim);
vector<vector<int>> vec;
vec.resize(firstDim);