для map к которому Вы обращаетесь вызывается этот же оператор new.
получается Вы обращаетесь к объекту BLOCKS до его создания.
spoiler#include <cstdio>
#include <cstdlib>
#include <map>
std::map<void*, size_t> BLOCKS;
void* operator new(std::size_t sz) {
std::printf("global op new called, size = %zu\n",sz);
void* p = std::malloc(sz);
//if(p) BLOCKS[p] = sz;
return p;
}
void operator delete(void* ptr) noexcept
{
std::puts("global op delete called");
std::free(ptr);
}
int main() {
int* p1 = new int;
delete p1;
}
global op new called, size = 48
global op new called, size = 4
global op delete called
global op delete called