Bonjour,
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
#include <iostream>
#include <unordered_map>
static std::unordered_map<void*, int> alloc_sizes;
static bool use_overrided_new_delete = false;
static size_t heap_usage = 0;
void* operator new(size_t size) {
void* ptr = malloc(size);
if (use_overrided_new_delete) {
use_overrided_new_delete = false;
//std::cout << "allocation of size: " << size << std::endl;
alloc_sizes[ptr] = size;
heap_usage += size;
use_overrided_new_delete = true;
}
return ptr;
}
void operator delete(void* ptr) {
if (use_overrided_new_delete) {
size_t size = alloc_sizes[ptr];
//std::cout << "deallocation of size " << size << std::endl;
heap_usage -= size;
}
free(ptr);
}
#define SIZE 1000
int main(int, char**) {
use_overrided_new_delete = true;
std::unordered_map<int, char> u;
for(int i = 0; i < SIZE; ++i){
u[i] = 0;
}
std::cout << "stack size: " << sizeof(u) << std::endl;
std::cout << "heap usage: " << heap_usage << std::endl;
// On doit désactiver les overrides pour permettre la désallocation de
// alloc_sizes sans seg fault
use_overrided_new_delete = false;
return 0;
} |
Puisqu'on ne connaît pas "à haut niveau" la taille de l'objet lors d'un delete, je dois l'enregistrer (ici dans alloc_sizes) dans une map lors du new. Par contre, puisque la manipulation de cette map entraine également l'usage du new, j'utilise le booléen use_overrided pour éviter des appels infinis.
Et j'obtiens pour la création d'un std::unordered_map<int, char> de 1000 éléments une taille de 27944 octets, ce qui est nettement plus que tes 1109 octets

Partager