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);