According to this question std::array
is allocated on the stack. However when using it together with Valgrind
it shows me a heap allocation, even for elements which are allocated on the stack. Is this a false positive or real?
Here follow two mwe
to illustrate the behavior.
No heap:
The following code:
#include <array>
int main() {
std::array<int*, 1> map;
int value = 0;
}
Produces the expected following Valgrind
output:
==14425== HEAP SUMMARY:
==14425== in use at exit: 0 bytes in 0 blocks
==14425== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
With heap:
However if I try this code:
#include <array>
int main() {
std::array<int*, 1> map;
int value = 0;
map.at(0) = &value;
}
Valgrind
gives me
==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==
Added compile settings:
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.
So in conclusion: yes, std::array is on the stack.
Creating an array in the heap double* B = new double[n]; allocates an array of 50 doubles. To allocate an array, use square brackets around the size. Unfortunately, expression new int(25) allocates one variable and stores 25 in it.
If you create an object with a C-style array or std::array member in a local variable, it's on the stack, with the array inside of it. If you create the object with new, it's on the heap, with the array also inside of it.
Unlike Java, C++ arrays can be allocated on the stack. Java arrays are a special type of object, hence they can only be dynamically allocated via "new" and therefore allocated on the heap.
The code
map.at(0) = &value;
introduces bounds checking, which might in turn need to use stuff allocated dynamically (e.g. from the <iostream>
library).
You may try again with
map[0] = &value;
which doesn't apply bound checks.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With