    #include <iostream>
    #include <new>
    using namespace std;

    class Data {
    public:
            Data(int first) {
                    data[0] = first;
                    cout<<"Constructor 1 " <<first;
            }
           
            Data(int first, int second) {
                    data[0] = first;
                    data[1] = second;
                    cout<<"Constructor 2 " <<first<< ";"<<second;
            }
     
            void* operator new(size_t x);
     
            void* operator new(size_t x, const std::nothrow_t& nothrow_value) throw();
     
            void operator delete(void* ptr);
     
    private:
            int data[10];
    };
     
    //class DataTag;
    class DumbClass{};
     
    //typedef boost::singleton_pool<DataTag, sizeof(Data)> DataPool;
     
    void* Data::operator new(size_t x) {
    	cout<<"new 1 operator called";
    	void* mem = malloc(x);
    	return mem;
            /*void* ptr = DataPool::malloc();
            if (ptr) {
                    return ptr;
            } else {
                    throw std::bad_alloc();
            }*/
    }
     
    void* Data::operator new(size_t x, const std::nothrow_t& nothrow_value) throw() {
    	    	cout<<"new 2 operator called";
    	    	return new DumbClass();
            //return DataPool::malloc();
    }
     
    void Data::operator delete(void* ptr) {
            //DataPool::free(ptr);
            free(ptr);
    }
     
    int main() {
    		Data* data = new Data(1, 2);
    		return 0;
            //Data* data = new Data(1);
            delete data;
            data = new (std::nothrow) Data(1, 2);
            delete data;
    }

