如果我的程序没有问题,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 std 生成 错误 valgrind 程序 我的 有问题 是否 STL 如果      更新时间:2023-10-16

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

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

这是因为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);

相关文章: