c++ - std::array 的堆分配
问题描述
根据这个问题 std::array
是在栈上分配的。但是,当将它与它一起使用时,Valgrind
它会向我显示堆分配,即使对于分配在堆栈上的元素也是如此。这是误报还是真的?
这里遵循两个mwe
来说明行为。
无堆:
以下代码:
#include <array>
int main() {
std::array<int*, 1> map;
int value = 0;
}
产生预期的以下Valgrind
输出:
==14425== HEAP SUMMARY:
==14425== in use at exit: 0 bytes in 0 blocks
==14425== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
带堆:
但是,如果我尝试这段代码:
#include <array>
int main() {
std::array<int*, 1> map;
int value = 0;
map.at(0) = &value;
}
Valgrind
给我
==14539== HEAP SUMMARY:
==14539== in use at exit: 72,704 bytes in 1 blocks
==14539== total heap usage: 1 allocs, 0 frees, 72,704 bytes allocated
==14539==
==14539== 72,704 bytes in 1 blocks are still reachable in loss record 1 of 1
==14539== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14539== by 0x4EC3EFF: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==14539== by 0x40106B9: call_init.part.0 (dl-init.c:72)
==14539== by 0x40107CA: call_init (dl-init.c:30)
==14539== by 0x40107CA: _dl_init (dl-init.c:120)
==14539== by 0x4000C69: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14539==
添加了编译设置:
g++ -std=c++11 -O0 valgrind.cpp -o valgrind_build -I ../fake -I ../src
valgrind --track-origins=yes --dsymutil=yes --leak-check=full --show-leak-kinds=all ./valgrind_build
valgrind --version
valgrind-3.11.0
g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
解决方案
编码
map.at(0) = &value;
引入了边界检查,这可能又需要使用动态分配的东西(例如从<iostream>
库中)。
你可以再试一次
map[0] = &value;
这不适用绑定检查。
推荐阅读
- stream - 如何从流中删除活动客户端?
- android - 如何清除 ListAdapter 中的数据
- python - 正则表达式允许模式中间的点和特殊字符
- aspose - 如何删除交叉引用的尾注部分中的“参考”一词
- javascript - Stream Deck C++ 插件中的 Unicode 字符串
- go - 如何使用 vscode 片段生成我自己的返回码?
- html - (html+css) 手机上的电话按钮分成两行,我怎样才能让它响应?
- jmeter - JMeter-从下一个 HTTP 请求的路径中的响应头中传递一个 id 值
- javascript - 使用 array.map 重新格式化对象数组
- powershell - Powershell else if 和文本颜色初学者