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

Does the STL generate valgrind errors for a std::vector of std::vector if my program is fine?

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

vector<vector<int>> vec;

构造函数做:

vec.reserve(firstDimension);

现在我用 valgrind 检查了我的程序。 Valgrind 抱怨很多:

Conditional jump or move depends on uninitialised value(s)

似乎与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 错误的情况,或者这是否表明我的程序存在问题?

这是因为 std::vector::reserve(n) 分配了至少容纳 n 个元素所需的内存,但它并没有构造实际的元素。 因此,分配的内存只是垃圾,您需要 emplace/insert 项到向量上才能实际构造内部向量。

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

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

或使用std::vector::resize(它实际上构造了你需要的内部向量):

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

请注意,第一种方法是执行此操作的首选方法。