std::allocator 的简单用法

#include <memory>				//shared_ptr && allocator


/*
 *	@brief
 *	Xxx内存池
 *	@multi-thread-safe:	NO
 */
class XxxMemoryPool
{
	friend class XxxMgr;
	typedef std::shared_ptr<Xxx> XxxPtr;
	typedef std::allocator<char> XxxPool;
	typedef std::shared_ptr<XxxPool> PoolPtr;

public:
	~XxxMemoryPool();

private:
	XxxMemoryPool() = default;

	void Init();

	XxxPtr GetXxx();

	void Free(Xxx* ptr);

private:
	PoolPtr _Xxx_pool;

	const static int Xxx_SIZE = sizeof(Xxx);
};






//




XxxMemoryPool::~XxxMemoryPool()
{
}

void Xxx_client::XxxMemoryPool::Init()
{
	if (_Xxx_pool)
	{
		_Xxx_pool.reset();
		_Xxx_pool = nullptr; 
	}

	_Xxx_pool = PoolPtr(new XxxPool());
	if (!_Xxx_pool)
	{
		const char *err_msg = "new a memory pool failed.";
		LOG4CPLUS_ERROR(Logger::getRoot(), err_msg);
		throw err_msg;
	}
}

XxxMemoryPool::XxxPtr XxxMemoryPool::GetXxx()
{
	if (!_Xxx_pool)
	{
		LOG4CPLUS_ERROR(Logger::getRoot(), "the memory pool ptr is nullptr. don't allocate memory.");
		return nullptr;
	}

	void* buff = _Xxx_pool->allocate(Xxx_SIZE);
	if (buff)
	{
		Xxx* Xxx = new(buff)Xxx;
		XxxPtr Xxx_ptr(Xxx, 
			std::bind(&XxxMemoryPool::Free, this, std::placeholders::_1));
		return Xxx_ptr;
	}
	else
	{
		LOG4CPLUS_ERROR(Logger::getRoot(), "allocate memory failed.");
		return nullptr;
	}
}

void Xxx_client::XxxMemoryPool::Free(Xxx* ptr)
{
	if (ptr)
	{
		ptr->~Xxx();
		char* p = (char*)(ptr);
		_Xxx_pool->deallocate(p, Xxx_SIZE);
	}
	else
	{
		LOG4CPLUS_ERROR(Logger::getRoot(), "don't free memory because ptr passed in is nullptr.");
	}
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值