码迷,mamicode.com
首页 > 其他好文 > 详细

STL——空间配置器

时间:2016-07-29 19:26:58      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:空间配置器

     __malloc_alloc_template分配器:该分配器是对malloc、realloc以及free的封装:

    当调用malloc和realloc申请不到内存空间的时候,会改调用oom_malloc()和oom_realloc(),这两个函数会反复调用用户传递过来的out of memory handler处理函数,直到能用malloc或者realloc申请到内存为止。

如果用户没有传递__malloc_alloc_oom_handler,__malloc_alloc_template会抛出__THROW_BAD_ALLOC异常。所以,内存不足的处理任务就交给类客户去完成。


//
#include<iostream>
#include<new>
using namespace std;

template <int inst>
class MallocAllocTemplate
{
public:
	typedef void(*MallocAllocHandler)();
protected:
	static	MallocAllocHandler _handler;
	static void* Oom_Malloc(size_t n)
	{
		MallocAllocHandler handler = NULL;
		void* ret = NULL;
		while (1)
		{
			handler = _handler;
			if (handler == NULL)
			{
				cout << "out of memory" << endl;
				//exit(1);
			}
			(*handler)();
			ret = malloc(n);
			if (ret)
				return ret;
		}
	}
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(*SetMallocHandler(MallocAllocHandler f))()
	{
		void(*old)() = _handler;
		_handler = f;
		return(old);
	}
};
void(*MallocAllocTemplate<1>::_handler)() = 0;
void Test1()
{
	MallocAllocTemplate<1> d;
	//int *p=(int*)MallocAllocTemplate<1>::Allocate(sizeof(int));
	int *p=(int*)d.Allocate(sizeof(int));
	*p = 2;
	cout << *p << endl;
	d.Deallocate(p, sizeof(int));
}

__default_alloc_template分配器

  这个分配器采用了内存池的思想,有效地避免了内碎片的问题(顺便一句话介绍一下内碎片和外碎片:内碎片是已被分配出去但是用不到的内存空间,外碎片是由于大小太小而无法分配出去的空闲块)。

  如果申请的内存块大于128bytes,就将申请的操作移交__malloc_alloc_template分配器去处理;如果申请的区块大小小于128bytes时,就从本分配器维护的内存池中分配内存。

  分配器用空闲链表的方式维护内存池中的空闲空间


本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1831719

STL——空间配置器

标签:空间配置器

原文地址:http://10541556.blog.51cto.com/10531556/1831719

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!