如果我的程序没问题,STL是否会为std :: vector的std :: vector生成valgrind错误?

时间:2015-05-20 21:08:11

标签: c++ stl valgrind

我在我的程序中使用向量向量:

vector<vector<int>> vec;

构造函数执行:

vec.reserve(firstDimension);

现在我用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
}

尽管如此,我现在有点困惑:我希望STL不会产生这样的错误。所以我想知道是否存在STL生成valgrind错误的情况,或者这是否表明我的程序存在问题?

1 个答案:

答案 0 :(得分:2)

这是因为std::vector::reserve(n)分配了至少保存n元素所需的内存,但它不构造实际元素。 因此,分配的内存只是垃圾,你需要在向量上emplace / insert项来实际构建内部向量。

如果你知道firstDim并且想要默认构造内部向量,请使用std::vecotor&#39}的大小构造函数:

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

或使用std::vector::resize(实际构建您需要的内部向量):

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

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