    #include <iostream>
    using namespace std;
     
    class Base
    {
    public:
    	Base() {};
    	virtual ~Base() {};
     
    	void* operator new[](size_t size)
    	{
    		size_t* ptr = static_cast<size_t*>(malloc((size + 1) * sizeof(size_t)));
    		if (ptr == nullptr)
    		{
    			throw std::bad_alloc();
    		}
    		*ptr = size;
    		return (ptr + sizeof(size_t));
    	}
     
    	void operator delete[](void* ptr, size_t size)
    	{
    		if (ptr != nullptr)
    		{
    			free(static_cast<size_t*>(ptr) - sizeof(size_t));
    		}
    	}
    };
     
    class Derived : public Base
    {
    public:
    	Derived(int value) :
    		m_value(value)
    		{
    		}
     
    private:
    	int m_value;
    };
     
    int main() {
    	Derived* i = new Derived[18] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 42, 100 };
    	void* i2 = i;
    	size_t* size = (static_cast<size_t*>(i2) - sizeof(size_t));
    	printf("Size: '%d'\n", (int)*size);
    	return 0;
    }
