#include struct new_tag_t { }; new_tag_t new_tag; struct Struct { int value; }; bool operator==(const Struct &a, const Struct &b) { return a.value == b.value; } typedef char buf_t[sizeof(Struct)]; buf_t global_new_buf, tagged_new_buf; // This overrides global operator new // This function and the following does not actually allocate memory. We are merely // trying to make sure it is getting called. void * operator new(std::size_t count) { return &global_new_buf; } // A custom allocator void * operator new(std::size_t count, const new_tag_t &) { return &tagged_new_buf; } int main() { Struct s1, s2, s3; s1.value = 3; s2.value = 5; s3.value = 3; return 0; // break here }