Bonjour,
Je fais (toujours) de l'embarqué (mais maintenant je fais du C++17) et j'aimerais traquer les allocations dynamiques de mémoire. Mon idée a donc été de remplacer les opérateurs new et delete globaux. Pour cela, j'ai lu les deux sections Global replacements des deux pages suivantes :
http://en.cppreference.com/w/cpp/mem...w/operator_new
http://en.cppreference.com/w/cpp/mem...perator_delete
J'en suis arrivé à la conclusion que je devais remplacer la version (1) de new et les versions (1) et (3) de delete. J'ai obtenu le code suivant, placé dans un fichier dédié :
Pour vérifier que ça fonctionne correctement, j'ai ensuite écrite un deuxième fichier cpp avec :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #include <cstdio> #include <cstdlib> std::size_t allocated = 0; unsigned int untracked_deletes = 0; void* operator new(std::size_t size) { std::printf("global op new called, size = %zu\n", size); allocated += size; return std::malloc(size); } void operator delete(void* ptr) noexcept { std::puts("Delete no size"); ++untracked_deletes; std::free(ptr); } void operator delete(void* ptr, std::size_t size) { std::printf("global op delete called, size = %zu\n", size); allocated -= size; std::free(ptr); }
La sortie en console donne avec mingw64 / gcc7:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #include <cstdio> extern std::size_t allocated; extern unsigned int untracked_deletes; class Foo { int array[32]; }; int main() { auto pi = new int; delete pi; auto pa = new int[10]; delete[] pa; auto pf = new Foo; delete pf; std::printf("Allocated %zu ; untracked %u", allocated, untracked_deletes); }
Je constate que new[] ne rappelle pas ma version de new. J'ai l'impression que cela correspondrait à la version (2) qui est pourtant décrite comme ceci :global op new called, size = 4
Delete no size
global op new called, size = 128
Delete no size
Allocated 132 ; untracked 2
Qu'est ce que j'ai raté ?2) Called by the array form of new[]-expressions to allocate all storage required for an array (including possible new-expression overhead). The standard library implementation calls version (1)
Merci d'avance !
Partager