120 lines
1.8 KiB
C++
120 lines
1.8 KiB
C++
//-----------------------------------------------------------------------------+
|
|
// Copyright (C), 1998-2007, SH Software Co. Ltd.
|
|
// = FileName : SafeHeapMem.h
|
|
// = Version : ver2.0
|
|
// = Author : zjq
|
|
// = CreateDate : 2002-09-09
|
|
// = Description: 类的声明 可以自由浅拷贝的堆内存资源
|
|
// = Maintainers:
|
|
//
|
|
//-----------------------------------------------------------------------------+
|
|
#ifndef _SAFEHEAPMEM_H_
|
|
#define _SAFEHEAPMEM_H_
|
|
|
|
#ifndef _SAFERESOURCE_H_
|
|
#include "SafeResource.h"
|
|
#endif
|
|
|
|
template<class T> class SafeHeapMem : public SafeResource
|
|
{
|
|
public:
|
|
|
|
//初次分配堆内存
|
|
SafeHeapMem(long size = 0);
|
|
|
|
//放弃堆空间
|
|
virtual ~SafeHeapMem();
|
|
|
|
//分配一个新资源并放弃原资源
|
|
void Realloc(long size);
|
|
|
|
T& operator*();
|
|
|
|
T& operator[](long index);
|
|
|
|
protected:
|
|
|
|
//释放堆内存
|
|
virtual void Release();
|
|
|
|
//获取堆内存
|
|
virtual void Apply(SafeResource& source);
|
|
|
|
protected:
|
|
|
|
T* p;
|
|
};
|
|
|
|
template<class T>
|
|
SafeHeapMem<T>::SafeHeapMem(long size)
|
|
{
|
|
//初次分配堆内存
|
|
//如果要求的长度<=0,则分配一个空内存,
|
|
if(size <= 0)
|
|
{
|
|
p = NULL;
|
|
}
|
|
else
|
|
{
|
|
p = new T[size];
|
|
}
|
|
}
|
|
|
|
template<class T>
|
|
void SafeHeapMem<T>::Realloc(long size)
|
|
{
|
|
//分配一个新资源并放弃原资源
|
|
Detach();
|
|
if(size <= 0)
|
|
{
|
|
p = NULL;
|
|
}
|
|
else
|
|
{
|
|
p = new T[size];
|
|
}
|
|
}
|
|
|
|
template<class T>
|
|
SafeHeapMem<T>::~SafeHeapMem()
|
|
{
|
|
//放弃堆空间
|
|
Detach();
|
|
}
|
|
|
|
template<class T>
|
|
T& SafeHeapMem<T>::operator*()
|
|
{
|
|
//p 不能为null
|
|
return *p;
|
|
}
|
|
|
|
template<class T>
|
|
T& SafeHeapMem<T>::operator[](long index)
|
|
{
|
|
//index必须是有效的
|
|
return p[index];
|
|
}
|
|
|
|
template<class T>
|
|
void SafeHeapMem<T>::Release()
|
|
{
|
|
//释放堆内存
|
|
//如果内存为不存在,则不进行任何操作。
|
|
if(p != NULL)
|
|
{
|
|
delete[] p;
|
|
p = NULL;
|
|
}
|
|
}
|
|
|
|
template<class T>
|
|
void SafeHeapMem<T>::Apply(SafeResource&source)
|
|
{
|
|
//获取堆内存
|
|
//得到它的地址,
|
|
p = ((SafeHeapMem<T>&)source).p;
|
|
}
|
|
|
|
#endif
|