// Example 13-32: Implementing new and delete with malloc and free.
#include <cstdlib>
#include <new>

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

void* operator new(std::size_t size, const std::nothrow_t&)
throw()
{
  return std::malloc(size);
}

void* operator new[](std::size_t size) throw(std::bad_alloc)
{
  return operator new(size);
}

void* operator new[](std::size_t size, const std::nothrow_t&)
throw()
{
  return operator new(size, std::nothrow);
}

void operator delete(void* ptr) throw()
{
  std::free(ptr);
}

void operator delete(void* ptr, const std::nothrow_t&)
throw()
{
  std::free(ptr);
}

void operator delete[](void* ptr) throw()
{
  operator delete(ptr);
}

void operator delete[](void* ptr, const std::nothrow_t&)
throw()
{
  operator delete(ptr);
}
