考虑到小型区块可能造成内存破碎问题,SGI设置了双层置配器.
置配器区块大于128Byte时,调用第一级的,
小于时128128Byte,调用第二级的.
- #include <new>
-
#include <iostream>
-
using namespace std;
-
-
template <int inst>
-
class _malloc_alloc_template
-
{
-
private:
-
//这3个函数用来处理内存不足的情况
-
static void * oom_malloc(size_t);
-
static void * oom_realloc(void *,size_t);
-
static void * (*_malloc_alloc_oom_handler)();
-
-
public:
-
-
static void * allocate(size_t n)
-
{
-
void * result = malloc(n);
-
if ( 0 == result) result = oom_malloc(n);
-
return result;
-
}
-
-
static void deallocate(void *p,size_t)
-
{
-
free(p);
-
}
-
-
static void * reallocate(void *p, size_t,size_t new_sz)
-
{
-
void *result = realloc(p,new_sz);
-
if ( 0 == result) result = oom_realloc(p,new_sz);
-
return result;
-
}
-
//这个函数仿真C++的set_new_handler(),换句话说,你可以通过它指定你的 out-of-memory handler
-
static void (* set_malloc_handler( void(*f)() ) ) ()
-
{
-
void (*old)() = _malloc_alloc_oom_handler;
-
_malloc_alloc_oom_handler = f;
-
return old;
-
}
-
};
-
-
template <int inst>
-
void (* _malloc_alloc_template<inst>::_malloc_alloc_oom_handler)() = 0;
-
-
template <int inst>
-
void * _malloc_alloc_template<inst>::oom_malloc(size_t n)
-
{
-
void * result;
-
void (*my_malloc_handler());
-
for (;;)//不断的释放,配置,再释放,再配置...
-
{
-
my_malloc_handler = _malloc_alloc_oom_handler;
-
if ( 0 == my_malloc_handler)
-
{
-
// _THROW_BAD_ALLOC;
-
}
-
(*my_malloc_handler)();
-
result = malloc(n);
-
if (result) return result;
-
}
-
}
-
-
template <int inst>
-
void * _malloc_alloc_template<inst>::oom_realloc(void *p, size_t n)
-
{
-
void * result;
-
void (*my_malloc_handler());
-
for (;;)
-
{
-
my_malloc_handler = _malloc_alloc_oom_handler;
-
if ( 0 == my_malloc_handler)
-
{
-
// _THROW_BAD_ALLOC;
-
}
-
(*my_malloc_handler)();
-
result = realloc(p, n);
-
if (result) return result;
-
}
-
}
-
-
typedef _malloc_alloc_template<0> malloc_alloc;
阅读(2367) | 评论(0) | 转发(0) |