#include <new>
#include <iostream>
#include <cstdlib>

struct allocator {};

void *operator new(std::size_t size, allocator&) {
    if(void *ptr = std::malloc(size)) {
        return ptr;
    }
    throw std::bad_alloc();
}

void operator delete(void *ptr) {
    std::cout << "deleting\n";
    std::free(ptr);
}

struct s {
    s() {
        throw "failed";
    }
};

int main() {
    allocator a;

    try {
        new (a) s;
    } catch(...) {
        std::cout << "catching\n";
    }
}
