gpt4 book ai didi

c++ - std::array 的堆分配

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:28 26 4
gpt4 key购买 nike

根据 this question 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;

不应用绑定(bind)检查。

关于c++ - std::array 的堆分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54676396/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com