利用模版类实现指针内存的分配管理
来源:互联网 发布:炒外汇的软件 编辑:程序博客网 时间:2024/05/02 00:48
内存分配与回收,一直都是令C/C++程序员们头痛的事情,不使用指针会降低程序的灵活性,同时也等于放弃了C/C++语言最大的优势,而使用指针就必须保证在任何情况下都不能出错,否则后果的严重性相信每个程序员都深有体会无需多讲。因此,在指针的使用上面,所有的程序员都战战兢兢,如履薄冰,同时相信每个人也都在不停的思考,并且总结出一套适合自己的方法去解决这个问题。本文使用模版类建立了一个对所有类型指针都通用的内存管理模版,目的是实现如下最基本的功能:
1. 对任何指针变量均通用
2. 可以安全的分配所需的内存
3. 无需程序员操作,实现资源的自动释放
类声明如下:
template<typename T>
class CMemAssign
{
public:
CMemAssign();
~CMemAssign(); //销毁内存
public:
//内存分派的长度 为了兼容类变量 分派和回收采用new,delete
//函数中设置单例标志,保证一个类实例只管理唯一类型指针的内存
T* CreateInstance(const long);
long GetLength(); //返回已分配内存长度
private:
T *pt_Var; //模版变量
long nLength; //内存长度
bool b_Single; //内存分配标志
};
template<typename T>
CMemAssign<T>::CMemAssign()
{
b_Single=false; //初始化单例标志
pt_Var=(T*)NULL;
}
template<typename T>
CMemAssign<T>::~CMemAssign()
{
if (pt_Var!=NULL)
{
delete [] pt_Var;
}
}
template<typename T>
T*CMemAssign<T>::CreateInstance(const long nLength) //创建实例分配内存
{
CPException *pExcep=new CPException("内存分配错误!",ERR_ALLOC_MEMORY);
if (b_Single==false){
//第一次创建
b_Single=true;
if(pt_Var!=NULL){
delete [] pt_Var;
pt_Var=NULL;
}
pt_Var=new T[nLength];
ASSERT(pt_Var!=NULL); //分配异常
if (pt_Var==NULL)
{
throw (pExcep);
}
int nDebug;
nDebug=0;
}
return pt_Var; //返回
}
template<typename T>
long CMemAssign<T>::GetLength()
{
return nLength;
}
该类通过模版可以兼容所有变量类型,为了兼容类类型保证构造函数和析构函数的能够被调用,在内存的创建和销毁时采用new和delete运算符。变量pt_Var实际上就是在类外使用的指针,它通过CreateInstance产生,并且只能被分配一次,该变量随着实例的生命周期的结束而销毁,无需程序员作任何操作。
程序示例如下:
void Test(){
CMemAssign<int> m_Assign;
int *pn_Test=m_Assign.CreateInstance(10); //创建10个int指针变量
}
当函数Test运行结束,m_Assign的生命周期结束,由实例管理的内存自动销毁。
但由于pt_Var指针被返回到了类外部,因此可以在外部被销毁,这一点为该模版安全性上留下了隐患,有待进一步改进
- 利用模版类实现指针内存的分配管理
- 指针以及内存的分配
- [c++运用]-利用指针查看分配内存及后续连接的内存---ShinePans
- spark的内存分配管理
- 内存分配详解、指针与数组[C++][内存管理]
- 内存分配详解、指针与数组[C++][内存管理]
- 内存分配详解、指针与数组[C++][内存管理]
- 内存分配详解、指针与数组[C++][内存管理]
- 内存分配详解、指针与数组[C++][内存管理]
- 内存分配详解、指针与数组[C++][内存管理]
- 内存分配详解、指针与数组[C++][内存管理]
- 内存分配详解、指针与数组[C++][内存管理]
- 内存分配详解、指针与数组[C++][内存管理]
- 类中指针成员的内存分配和初始化
- 模版函数指针,C++委托的实现
- 模版函数指针,C++委托的实现
- 模版函数指针,C++委托的实现
- 模版函数指针,C++委托的实现
- MiniDB实训第八天--赢得一个西瓜
- VC++ 的串口通讯
- asp使用mysql数据库
- 在UltraWebGrid的foot显示汇总 平均等
- 以太网简介
- 利用模版类实现指针内存的分配管理
- Using the Java APIs for Bluetooth Wireless Technology, Part 1 - API Overview
- JBuilder2005 Struts深度体验之升级
- 一段英文自介
- 技术文章还是应该发在csdn上
- 测试-为“日”字加一笔,你第一反应是什么字?
- 篇1:进入嵌入式世界
- 篇2:什么是嵌入式?
- Effective Debug Logging (part 1)