Onega

a lot of VC++ posts, a few C# posts, and some miscellaneous stuff

Tuesday, August 14, 2012

Use boost::pool to allocate memory from a fixed size block of memory

I need to initialize chunk_size and max_alloc_size to the same value, and also provide a customized UserAllocator.
#include <boost/pool/pool.hpp>
#include <iostream>
#include <iomanip>
struct fixed_allocator_new_delete
{
  typedef std::size_t size_type; //!< An unsigned integral type that can represent the size of the largest object to be allocated.
  typedef std::ptrdiff_t difference_type; //!< A signed integral type that can represent the difference of any two pointers.

  static char * malloc BOOST_PREVENT_MACRO_SUBSTITUTION(const size_type bytes)
  { //! Attempts to allocate n bytes from the system. Returns 0 if out-of-memory
   static bool first_time=true;
   char* pblock=NULL;
   if(first_time)
   {
   pblock= new (std::nothrow) char[bytes];
   first_time=false;
   }
   std::cout << __FUNCTION__ << "("<<std::dec<<bytes<<") return " <<std::hex<<(int)pblock <<"\n";
   return pblock;
  }
  static void free BOOST_PREVENT_MACRO_SUBSTITUTION(char * const block)
  { //! Attempts to de-allocate block.
    //! \pre Block must have been previously returned from a call to UserAllocator::malloc.
   std::cout << __FUNCTION__<<"("<<std::hex<<(int)block<<")\n";
    delete [] block;
  }
};

int main()
{
 boost::pool<fixed_allocator_new_delete> mypool(sizeof(int), 1000, 1000);
 std::cout<<"before allocation.\n";
 for (int i=0; i<100*100; i++)
 {
  void* pblock=mypool.malloc();
  if(!pblock)
  {
   std::cout<<"i="<<std::dec<<i<<", return null.\n";
   break;
  }
 }
 return 0;
}

Labels: ,