C++ 内存分配(new,operator new、placement new)详解

推荐两篇文章:

1、http://blog.csdn.net/wudaijun/article/details/9273339

2、http://www.cnblogs.com/luxiaoxun/archive/2012/08/10/2631812.html

再来一个内存池的代码:

#ifndef MEM_BASE_HPP_201107042302
#define MEM_BASE_HPP_201107042302

#include <vector>
#include <stdlib.h>
#include <iostream>

using namespace std;

namespace sparrow
{

	/**用于内存对齐的联合*/
	union align_info{
		int (*i)();
		void* p;
		long l;
	};

	/**内存链表结点*/
	class mem_node{
	public:
		mem_node(void) : pnext_(NULL){};
		~mem_node(void){
			pnext_ = NULL;
		};

		mem_node* next(void) const{return pnext_;};
		void next(mem_node *pnext){pnext_ = pnext;};
	private:
		mem_node *pnext_;
	};

	/**空闲内存链表
	*/
	class mem_free_list{
	public:
		mem_free_list(void) : pnode_(NULL){};
		~mem_free_list(void){pnode_ = NULL;};

		void add(mem_node *pnode){
			if(NULL == pnode) return;
			if(NULL == pnode_){
				pnode_ = pnode;
				pnode_->next(NULL);
			}else{
				pnode->next(pnode_);
				pnode_ = pnode;
			}
		};

		void* remove(void){
			mem_node *pnode = pnode_;
			if(NULL == pnode) return pnode;
			pnode_ = pnode_->next();
			return pnode;
		};

		void clear(void)
		{
			pnode_ = NULL;
		};

	private:
		mem_node *pnode_;
	};

	class memory_pool
	{
		typedef std::vector<char*>	_arr_mem;

	public:
		memory_pool(void) : 
		is_inited_(false), objsize_(0), inc_count_(0)
		{	
		};
		~memory_pool(void)
		{
			relase_memory();
		};

		/*
		初始化
		objsize  对象大小
		count	 对象数量
		inc_count 当对象用完之后,每次增加的数量
		*/
		int init(const size_t objsize, const size_t count, const size_t inc_count)
		{
			if(is_inited_) return 0;

			if(0 == count || 0 == inc_count)
			{
				return -1;
			}

			objsize_	= objsize;
			inc_count_	= inc_count;
			if(objsize_ < sizeof(mem_node)) objsize_ = sizeof(mem_node);
			int ret =  inc_mem(count);
			if(0 != ret)
			{
				return -1;
			}
			is_inited_ = true;
			return 0;
		};

		bool is_inited(void) const
		{
			return is_inited_;
		};
		
		void* malloc(void)
		{
			void *p = free_list_.remove();
			if(NULL == p)
			{
				inc_mem(inc_count_);
				p = free_list_.remove();
			}
			return p;
		};
		void free(void *p){
			if(NULL == p) return;
			free_list_.add((mem_node*)p);
		};

		void relase_memory(void)
		{
			for(_arr_mem::iterator iter = arr_mem_.begin(); iter != arr_mem_.end(); ++ iter)
			{
				char *mem = *iter;
				::free(mem);
			}
			arr_mem_.clear();
			free_list_.clear();
			
			is_inited_ = false;
			objsize_	= 0;
			inc_count_  = 0;
		};

	private:
		int inc_mem(const size_t count)
		{
			if(0 == count) return -1;

			char *mem = (char*)::malloc(objsize_ * count);
			if(NULL == mem) return -1;
			
			arr_mem_.push_back(mem);

			mem_node *pnode = NULL;
			for(size_t i = 0; i < count; ++ i)
			{
				pnode = new (mem + i * objsize_) mem_node();
				free_list_.add(pnode);
			}
			return 0;
		};

	private:
		bool			is_inited_;
		_arr_mem		arr_mem_;
		mem_free_list	free_list_;
		size_t			objsize_;
		size_t			inc_count_;
	};

	template<typename T>
	class mem_base
	{
		enum{
			DEF_COUNT = 128,
			INC_COUNT = 128
		};
	public:
		mem_base()
		{
			cout << "mem_base init" << endl;
		}
		
		static void* operator new(size_t size, void *p){return p;} 

		static void* operator new(size_t size){
			cout << "mem_base operator new running" << endl;
			if(!mem_pool_.is_inited())
			{
				mem_pool_.init(sizeof(T), DEF_COUNT, INC_COUNT);
			}
			return mem_pool_.malloc();
		};
		static void operator delete(void *p){
			mem_pool_.free(p);
		};

	private:
		static memory_pool		mem_pool_;
	};
	template<typename T>
	memory_pool mem_base<T>::mem_pool_;
}

#endif


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值