Search code examples
c++memory-managementc++-faq

How might I overload the "new" operator to allocate memory from a secondary memory device?


I am looking for a syntax to allocate memory from a secondary memory device and not from the default heap.

How can i implement it? Using malloc() would by default take it from heap... Surely there must be another way!


Solution

  • #include <new>
    
    void* operator new(std::size_t size) throw(std::bad_alloc) {
      while (true) {
        void* result = allocate_from_some_other_source(size);
        if (result) return result;
    
        std::new_handler nh = std::set_new_handler(0);
        std::set_new_handler(nh);  // put it back
        // this is clumsy, I know, but there's no portable way to query the current
        // new handler without replacing it
        // you don't have to use new handlers if you don't want to
    
        if (!nh) throw std::bad_alloc();
        nh();
      }
    }
    void operator delete(void* ptr) throw() {
      if (ptr) {  // if your deallocation function must not receive null pointers
        // then you must check first
        // checking first regardless always works correctly, if you're unsure
        deallocate_from_some_other_source(ptr);
      }
    }
    void* operator new[](std::size_t size) throw(std::bad_alloc) {
      return operator new(size);  // defer to non-array version
    }
    void operator delete[](void* ptr) throw() {
      operator delete(ptr);  // defer to non-array version
    }