Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Heap allocation for std::array

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.
like image 588
magu_ Avatar asked Feb 13 '19 17:02

magu_


People also ask

Does STD array allocate on heap?

So in conclusion: yes, std::array is on the stack.

How do I allocate an array in heap?

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.

Does std :: array use the heap or the stack?

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.

Are arrays stored in stack or heap C++?

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.


1 Answers

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.

like image 193
πάντα ῥεῖ Avatar answered Sep 18 '22 23:09

πάντα ῥεῖ