数组在C语言里面经常使用,有一个缺陷就是必须在定义的时候就指定大小,一旦申请后这片区域就不能动态的扩展。但是很多情况下我们并不知道大小是多少,于是就需要动态分配内存来存储。这里仅仅是一个小例,希望可以起到抛砖引玉的作用。
为什么使用模板?使用模板的通用性很强,数组可能是int类型,也可能是bool类型……,使用模板就避免了为每一种类型去量身定制一套相同的功能。我想,这也是C++模板的初衷吧。
直接上代码:
template<class T, int row=0, int column=0>
class CMyArray
{
public:
CMyArray()
:m_pData(NULL)
,m_nRow(row)
,m_nColumn(column)
{
if ( m_nRow>0 && m_nColumn>0 )
Allocate();
}
~CMyArray()
{
Free();
}
bool Resize(const int nRow, const int nColumn)
{
if ( nRow<=0 || nColumn<=0 )
return false;
m_nRow = nRow;
m_nColumn = nColumn;
Allocate();
return true;
}
T GetAt(const int nRow, const int nColumn)
{
if ( nRow>=m_nRow || nColumn>=m_nColumn )
return T();
return *(m_pData+nRow*m_nColumn+nColumn);
}
void SetAt(const int nRow, const int nColumn, const T& data)
{
if ( nRow>=m_nRow || nColumn>=m_nColumn )
return ;
*(m_pData+nRow*m_nColumn+nColumn) = data;
}
protected:
void Allocate()
{
Free();
m_pData = (T*)malloc(m_nRow*m_nColumn*sizeof(T));
}
void Free()
{
if ( m_pData )
{
free(m_pData);
m_pData = NULL;
}
}
private:
T* m_pData;
int m_nRow;
int m_nColumn;
};
buffer里面存储着这片连续内存空间的地址,对于这个区域的操作(释放/申请),最好是在一个函数里面进行,以免在多线程时出现内存读写错误。(多线程时,我们只需要对这个函数里面加锁就可以了)。
后记:
对于多维数组,还可以扩展。性能方面这里是没有考虑的,如果需要申请的内存小于等于当前内存时,完全可以不进行释放/申请过程。