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

struct X
{
    void *
    operator new(
        std::size_t count )
    {
        std::cout << "Custom new called." << std::endl;
        return std::malloc( count );
    }

    void
    operator delete(
        void * addr )
    {
        std::cout << "Custom delete called." << std::endl;
        return std::free( addr );
    }
};

int
main( int, char ** )
{
    std::cout << "std::make_shared" << std::endl;
    {
        std::make_shared<X>();
    }
    std::cout << "no std::make_shared" << std::endl;
    {
        std::shared_ptr<X>( new X() );
    }
    return 0;
}

