views:

196

answers:

2

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!

A: 

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.

wallyk
+7  A: 
#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
}
Roger Pate
Thanks Roger,Can you please give me the exact function for doing:allocate_from_some_other_source(size);
Sandeep
No, he can't. If you'll see my comment, it completely depends on *your* platform. C++ doesn't say a word on the machine it's running on.
GMan
Those allocate and deallocate functions are where you communicate with your "secondary memory device". Exactly what they will be will depend on what you're doing.
Roger Pate