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

后端 未结 2 1247
我在风中等你
我在风中等你 2020-12-17 06:11

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

相关标签:
2条回答
  • 2020-12-17 06:53

    You'd have to build or adapt your own heap manager, and overload new and delete, as well as new[] and delete[]. Initialize the heap manager with the special memory.

    0 讨论(0)
  • 2020-12-17 06:57
    #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
    }
    
    0 讨论(0)
提交回复
热议问题