如果我的程序没问题,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);
请注意,第一种方法是执行此操作的首选方法。
我在我的程序中使用了向量的向量:
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);
请注意,第一种方法是执行此操作的首选方法。