如果我的程序没有问题,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抱怨了很多:
条件跳转或移动取决于未初始化的值
它们似乎与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);
相关文章:
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 连接和压缩标准::vector<std::字符串的最佳方法>
- C++从 std::vector<std::function<中删除 std::function>>
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- 如何使用 CUDA 将 std::vector<std::string> 复制到 GPU 设备
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- 将 std::vector<std::unique_ptr<T>> 移动到 std::vector<std::shared_ptr<T>>
- 如何从 boost::container::vector<std::string>::iterator 访问索引和对象?
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- 为什么转置这个 std::vector<std::vector<std::string> > 这么慢?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 在 boost::<double>asio::buffer 中使用像 std::vector<std::complex> 这样的参数
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 如何检查 std::vector<std::string> 的元素是否以某个子字符串开头?
- 在 std::vector<std::vector 中重新存储内部向量<TYPE>>
- 将 std::vector<std::string> 转换为 const char* const*
- 不能将结构push_back() 转换为 std::vector<std::shared_ptr<theStruct>> theVector
- SWIG:传递一个 std::vector< std::vector <double> >指向 python 的指针
- 将 std::vector<std::p air<const K, V>*> 转换为 std::vector<std::p air<const K, V>&g