我在我的程序中使用向量向量:
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错误的情况,或者这是否表明我的程序存在问题?
答案 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);
请注意,第一种方法是首选方法。