STL的第一级配置器

考虑到复杂度问题,没有实现异常处理.

学习STL主要目的之一是为了学习内存管理

#ifndef __H_MALLOC
#define __H_MALLOC
#include <stdlib.h>
#include <cstddef>
#include <iostream>
using namespace std;
template<int inst>
class __malloc_alloc_template
{
private:
/* 以下函数用于处理内存不足的情况 */
static void* oom_malloc(size_t);
static void* oom_realloc(void *, size_t);
// define a pointer to a function (passed void) return void
static void (* __malloc_alloc_oom_handler)();

public:

static void* allocate(size_t n)
{
void* result = malloc(n);
// 无法满足需求时,改用 oom_malloc(n)
if(result == 0)
result = oom_malloc(n);
return result;
}


static void deallocate(void* p, size_t /* n */)
{
free(p);
}

static void* reallocate(void* p, size_t /* old_sz */, size_t new_sz)
{
void* result = realloc(p, new_sz);
// 无法满足需求时,改用 oom_realloc()
if(result == 0)
result = oom_realloc(p, new_sz);
return result;
}

static void (* set_malloc_handler(void (*f)()))()
{
void (* old)() = __malloc_alloc_oom_handler;
__malloc_alloc_oom_handler = f;
return old;
}
};

// malloc_alloc out-of-memory handing
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)
{
// define a pointer to a function (passed void) return void
void (* my_alloc_hander)();
void* result;

for(;;)
{
my_alloc_hander = __malloc_alloc_oom_handler;
if(0 == my_alloc_hander)
{
cout<< "out of memory" << endl;
}

扫描二维码关注公众号,回复: 1557845 查看本文章

(*my_alloc_hander)(); // 调用处理例程,企图释放内存
result = malloc(n); // 再次尝试配置内存
if(result)
return result;
}
}


template<int inst>
void * __malloc_alloc_template<inst>::oom_realloc(void* p, size_t n)
{
// define a pointer to a function (passed void) return void
void (* my_alloc_hander)();
void* result;

for(;;)
{
my_alloc_hander = __malloc_alloc_oom_handler;
if(0 == my_alloc_hander)
{
cout << "out of memory" << endl;
}

(*my_alloc_hander)(); // 调用处理例程,企图释放内存
result = realloc(p, n); // 再次尝试配置内存
if(result)
return result;
}
}

typedef __malloc_alloc_template<0> malloc_alloc;

#endif

猜你喜欢

转载自www.cnblogs.com/cccv/p/stl_001.html