自动释放资源的模板类

/**
 * @file    CNewBuffMngr.h
 * @brief   用new[]操作符创建数组并管理对应的内存
 * 
 *  Developer can include this file in your project to build applications.
 *  For more information, please read the developer guide.
 
 *  Use of this software is subject to certain restrictions and limitations set
 *  forth in a license agreement entered into between iFLYTEK, Co,LTD.
 *  and the licensee of this software.  Please refer to the license
 *  agreement for license use rights and restrictions.
 *
 *  Copyright (C)    1999 - 2008 by ANHUI USTC iFLYTEK, Co,LTD. 
 *                   All rights reserved.
 * 
 * @author  minglu2
 * @version 1.0
 * @date   2017/06/09 
 * 
 * @see        
 * 
 * History:
 * index    version        date            author        notes
 * 0        1.0            2017/06/09          minglu2        Create this file
 */
#ifndef _CNEWBUFFMNGR_H_
#define _CNEWBUFFMNGR_H_
#ifdef __cplusplus
extern "C" {
#include <stdio.h>
#endif
#ifdef __cplusplus
}
#endif
#include <stdio.h>
/************************************************************************/
/*   创建并管理一个数组,此数组不可跨函数使用                                                                   */
/************************************************************************/
template <typename Element_Type>
class CNewBuffMngr
{
public:
	//创建一个内存并返回首地址
	CNewBuffMngr(Element_Type*& pElement, size_t Size_Of_Array)
	{
		pElement = new Element_Type[Size_Of_Array];
		memset(pElement, 0, Size_Of_Array);
		m_pElement = pElement;
	}

	~CNewBuffMngr()
	{
		if (m_pElement)
		{
			delete[] m_pElement;
			m_pElement = NULL;
		}
	}
protected:
private:
	CNewBuffMngr& operator=(const CNewBuffMngr&);
	CNewBuffMngr(const CNewBuffMngr&);
    Element_Type* m_pElement;
};

/************************************************************************/
/* 创建并管理一个文件句柄,此数组不可跨函数使用                                                                  */
/************************************************************************/
class CFileMng
{
public:
	/** 
	* @ func:  CFileMng
	* @ brief:  按照指定模式打开指定文件,并返回对应的文件指针,如果出错则返回NULL
	* 
	* @author iFLYTEK
	* Access: public 
	* @return: 出错则返回NULL;否则返回文件指针
	* @param: FILE *  & pFile [out] 可能为NULL
	* @param: const char * file_patch 文件路径
	* @param: const char * mode 打开模式
	* @see
	*/
	CFileMng(FILE* &pFile ,const char* file_patch, const char* mode)
	{
		if (file_patch && mode)
		{
			m_pFile = fopen(file_patch, mode);
		}
		else
		{//参数不合法
			m_pFile =  NULL;
		}
		pFile = m_pFile;
	}

	~CFileMng()
	{
		if (m_pFile)
		{
			fclose(m_pFile);
			m_pFile = NULL;
		}
	}
protected:
private:
	CFileMng& operator=(const CFileMng&);
	CFileMng(const CFileMng&);
	FILE* m_pFile;
};

/************************************************************************/
/*  普通的资源管理模块,在对象析构时调用注册进来的回调函数。                                                                    */
/************************************************************************/
typedef void* (*CallBack_Func_Type)(void*);
class CCommonResMng
{
public:

	/** 
	* @ func:  CCommonResMng
	* @ brief: 根据外部资源极其释放函数来生成一个资源管理对象
	* @author iFLYTEK
	* Access: public 
	* @return: 
	* @param: void * pRes 资源
	* @param: CallBack_Func_Type pRelease_Source_Callback_Fun  指向用于释放资源的函数
	* @see
	*/
	CCommonResMng(void *pRes ,CallBack_Func_Type pRelease_Source_Callback_Fun)
	{
		m_pRes = pRes;
		m_pRelease_Source_Callback_Fun = pRelease_Source_Callback_Fun;
	}
	virtual ~CCommonResMng(void)
	{
		if (m_pRes && m_pRelease_Source_Callback_Fun)
		{
			m_pRelease_Source_Callback_Fun(m_pRes);
			m_pRelease_Source_Callback_Fun = NULL;
		}
	}
protected:
private:
	CallBack_Func_Type m_pRelease_Source_Callback_Fun;  //函数指针,指向用于释放资源的回调函数
	void* m_pRes; //指向外部的资源实体对象
};

#endif  //_CNEWBUFFMNGR_H_



将资源管理类和boost/shared_ptr结合使用,则可以解决跨域情况下的资源管理问题。即保证资源管理类所生成的对象有且仅被析构一次。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值