[C++17] Remplacement global de new et delete
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é :
Code:
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);
} |
Pour vérifier que ça fonctionne correctement, j'ai ensuite écrite un deuxième fichier cpp avec :
Code:
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);
} |
La sortie en console donne avec mingw64 / gcc7:
Citation:
global op new called, size = 4
Delete no size
global op new called, size = 128
Delete no size
Allocated 132 ; untracked 2
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 :
Citation:
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)
Qu'est ce que j'ai raté ?
Merci d'avance ! :ccool: