#include <cstdio>

struct Sub
{
    char member;

	Sub() { std::printf("Sub()\n"); }
	~Sub() { std::printf("~Sub()\n"); }

	void *operator new(std::size_t size) { throw "fuck"; }
	void operator delete(void *p) { throw "fuck"; }
};

struct A
{
	char member;

	Sub sub;

	A() { std::printf("A()\n"); }
	~A() { std::printf("~A()\n"); }

	void *operator new(std::size_t size)
	{
		std::printf("A::operator new(%zu)\n", size);
		return ::operator new(size);
	}

	void operator delete(void *p)
	{
		std::printf("A::operator delete\n");
		::operator delete(p);
	}
};

int main()
{
	auto *pa = new A;
	std::printf("----\n");
	delete pa;
}

