【C++】SGI一级空间配置器

一、SGI空间配置器介绍

在这里插入图片描述

一级配置器:

  • 使用malloc / free

二级配置器:

申请/释放空间使用手段
> 128字节使用一级配置器malloc / free
<= 128字节使用使用内存池memory pool

注意:二级配置器有可能会使用一级配置器。

二、一级空间配置器的实现

#ifndef MY_ALLOC_H
#define MY_ALLOC_H
#include<iostream>
namespace pzj
{
//开关语句
#if 0
#include<new>
#define __THROW_BAD_ALLOC throw std::bad_alloc;
#elif !defined (__THROW_BAD_ALLOC)
#define __THROW_BAD_ALLOC std::cout << "Out Of Memory"<< endl; exit(1);
#endif


//2:05
	template<int inst>
	class __malloc_alloc_template
	{
	public:
		using PFUN = void(*)();
		//typedef void(*PFUN)();

	private:
		//malloc空间不足
		static void* oom_malloc(size_t n)
		{
			void* result = NULL;
			void (*my_malloc_handler)() = NULL;
			while (1)
			{
				my_malloc_handler = __malloc_alloc_oom_handler;
				if (my_malloc_handler == NULL)
				{
					__THROW_BAD_ALLOC;
				}
				//释放出更多内存
				my_malloc_handler();
				result = malloc(n);
				if (result != NULL)
				{
					return result;
				}
			}
		}
		//realloc空间不足
		static void* oom_realloc(void* p, size_t n)
		{
			void* result = NULL;
			void (*my_malloc_handler)() = NULL;
			while (1)
			{
				my_malloc_handler = __malloc_alloc_oom_handler;
				if (my_malloc_handler == NULL)
				{
					__THROW_BAD_ALLOC;
				}
				//释放出更多内存
				my_malloc_handler();
				result = realloc(p ,n);
				if (result != NULL)
				{
					return result;
				}
			}
		}
		//函数指针解决内存不足
		static PFUN __malloc_alloc_oom_handler;

	public:
		//malloc申请空间
		static void* allocate(size_t n)
		{
			void* result = malloc(n);
			if (result == NULL)
			{
				return oom_malloc(n);
			}
			return result;
		}
		//free释放空间
		static void deallocate(void* p, size_t n)
		{
			free(p);
		}
		//realloc扩容
		static void* reallocate(void* p, size_t old_size, size_t new_size)
		{
			void* result = realloc(p, new_size);
			if (result == NULL)
			{
				oom_realloc(p, new_size);
			}
			return result;
		}

		//解决内存不足
		static PFUN set_malloc_handler(PFUN p)
		{
			PFUN old = __malloc_alloc_oom_handler;
			__malloc_alloc_oom_handler = p;
			return old;
		}
	};
	//类外初始化
	template<int inst>
	typename __malloc_alloc_template<inst>::PFUN
		__malloc_alloc_template<inst>::__malloc_alloc_oom_handler = NULL;

	//类型重命名
	typedef __malloc_alloc_template<0> malloc_alloc;

}

#endif

三、一级空间配置器测试

#include"my_alloc.h"


//占用的空间
char* p = (char*)malloc(10000);


//释放空间函数
void rest()
{
	if (p != NULL)
	{
		free(p);
	}
	p = NULL;
	//将
	pzj::malloc_alloc::set_malloc_handler(NULL);
}


int main()
{
	//设置内存清理函数
	pzj::malloc_alloc::set_malloc_handler(rest);

	//开辟新空间
	void* sp = pzj::malloc_alloc::allocate(1000);
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值