Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jul 14th, 2012  |  syntax: None  |  size: 1.34 KB  |  hits: 8  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. Dealing with std::string/std::vector member variables while using boost::singleton_pool
  2. class MyOrder{
  3.     std::vector<int> v1_;
  4.     std::vector<double> v2_;
  5.  
  6.     std::string s1_;
  7.     std::string s2_;
  8.  
  9. public:
  10.     MyOrder(const std::string &s1, const std::string &s2): s1_(s1), s2_(s2) {}
  11.  
  12.     ~MyOrder(){}
  13.  
  14.     static void * operator new(size_t size);
  15.     static void operator delete(void * rawMemory) throw();
  16.     static void operator delete(void * rawMemory, std::size_t size) throw();
  17.  
  18. };
  19.  
  20. struct MyOrderTag{};
  21. typedef boost::singleton_pool<MyOrderTag, sizeof(MyOrder)> MyOrderPool;
  22.  
  23. void* MyOrder:: operator new(size_t size)
  24. {
  25.     if (size != sizeof(MyOrder))
  26.         return ::operator new(size);
  27.  
  28.     while(true){
  29.         void * ptr = MyOrderPool::malloc();
  30.         if (ptr != NULL) return ptr;
  31.  
  32.         std::new_handler globalNewHandler = std::set_new_handler(0);
  33.         std::set_new_handler(globalNewHandler);
  34.  
  35.         if(globalNewHandler)  globalNewHandler();
  36.         else throw std::bad_alloc();
  37.  
  38.     }
  39. }
  40.  
  41. void MyOrder::operator delete(void * rawMemory) throw()
  42. {
  43.     if(rawMemory == 0) return;
  44.     MyOrderPool::free(rawMemory);
  45. }
  46.  
  47. void MyOrder::operator delete(void * rawMemory, std::size_t size) throw()
  48. {
  49.     if(rawMemory == 0) return;
  50.     if(size != sizeof(Order)) {
  51.         ::operator delete(rawMemory);
  52.     }
  53.     MyOrderPool::free(rawMemory);
  54. }