// 在扩大部分的内存空间上建立T类型的数组对象,并调用其默认构造函数
for(int i = m_iSize; i < iSize; i++)
{
new(&m_pBuf[i]) T();
}
m_iSize = iSize;
return true;
}上面的代码已基本实现了动态一维数组的要求。但有一个点必须当心,就是数组空间的释放问题。在Dynamic1Dim的析构函数中必须释放动态分配的空间。
//--------------------------------------------------// Destructor
template
Dynamic1Dim::~Dynamic1Dim()
{
// 调用T类的析构函数
for(int i = 0; i < m_iSize; i++)
{
m_pBuf [i].~T();
}
// 释放内存空间
free(m_pBuf);
}
注意,m_pElem[i].~T()是必要的,因为T对象中也可能有内存的分配。如果没有这句,T对象中分配的内存就无法释放,其实这也是很多内存泄露的原因。
上面的代码实现了动态一维数组的模板。我们最后就要讨论动态二维数组的实现。
我们会希望有这样的二维数组:
CDynamic2Dim m_dim; // m_dim的大小是1*1
然后执行下面的语句:
m_dim[1][3] = 33;
m_dim[4][10] = 710;
此时m_dim的大小是:0、2、3行都只有一个元素,1行有4个元素,4行有11个元素。 可以这样设想,动态二维数组是由数目不定的动态一维数组组成的。基于这种想法,我们看一下动态二维数组的实现。
template
class Dynamic2Dim
{
public:
Dynamic2Dim();
~Dynamic2Dim();
Dynamic1Dim& operator[] (int index);
protected:
bool EnlargeY(int nYSize);
private:
int m_iYSize;
Dynamic1Dim* m_pYBuf;
Dynamic1Dim m;
};
初始的二维数组应该是1*1大小的,因此Dynamic2Dim的构造函数应该如下
// Constructor
template
Dynamic2Dim::Dynamic2Dim()
{
m_iYSize = 1;
m_pYBuf = (Dynamic1Dim*) malloc(sizeof(Dynamic1Dim));
m_pYElem = new(m_pYBuf) Dynamic1Dim();
}
在析构函数中释放分配的内存空间:
// Desctructor
template
Dynamic2Dim::~Dynamic2Dim()
{
for(int i = 0; i < m_iYSize; i++)
{
m_pYElem[i].~Dynamic1Dim();
}
free(m_pYBuf);
}
需要为动态二维数组重载操作符[],其实现如下
// operator[] overload
template
Dynamic1Dim& Dynamic2Dim::operator[] (int index)
{
if(index < 0) throw std::out_of_range("negative index!");
if(index > m_iYSize - 1)
EnlargeY(index + 1);
return m_pYElem[index];
}
从上我们可以知道,这里实现的是二维数组的纵向扩大,即根据二维数组的第一下标在决定是否扩大二维数组。这里