最近在看一个关于动态数组模板的代码。是这样的:
template<typename T>
class Dynamic1Dim
{
public:
Dynamic1Dim();
~Dynamic1Dim();
T& operator[](int index);
protected:
bool EnlargeDim(int iSize);
public:
T* m_pBuf;
int m_iSize;
};//--------------------------------------------------// 构造函数
Dynamic1Dim<T>::Dynamic1Dim()
{
//数组的初始大小的1个T类型对象
//分配一块内存其大小为T型类所占的空间 m_pBuf = (T*)malloc(sizeof(T)); //在内存空间中建立一个T型对象 new(m_pBuf) T();
m_iSize = 1;
}//--------------------------------------------------// operator []
T& Dynamic1Dim<T>::operator [](int index)
{
// 如果下标是负值,抛出一个异常 if( index < 0 ) throw std::out_of_range(" Index shouldn\\\'\\\'t be negative"); //检查下标是否超来数组大小,如果超过则调用EnlargeDim扩大数组 if(index > m_iSize - 1)
EnlargeDim(index + 1);
Return m_pBuf [index];
}//--------------------------------------------------// EnlargeDim
bool Dynamic1Dim<T>::EnlargeDim(int iSize)
{ // 重新分配一块内存,其大小为扩大后T类型数组的大小 m_pBuf = (string*) realloc(m_pBuf, sizeof(T) * iSize); // 在扩大部分的内存空间上建立T类型的数组对象,并调用其默认构造函数 for(int i = m_iSize; i < iSize; i++)
{
new(&m_pBuf[i]) T();
} m_iSize = iSize;
return true;
}//--------------------------------------------------// Destructor
Dynamic1Dim<T>::~Dynamic1Dim()
{
// 调用T类的析构函数 for(int i = 0; i < m_iSize; i++)
{
m_pBuf [i].~T();
} // 释放内存空间
free(m_pBuf);
}其中红色的那行代码百思不得其解,往大家帮我解释一下。
template<typename T>
class Dynamic1Dim
{
public:
Dynamic1Dim();
~Dynamic1Dim();
T& operator[](int index);
protected:
bool EnlargeDim(int iSize);
public:
T* m_pBuf;
int m_iSize;
};//--------------------------------------------------// 构造函数
Dynamic1Dim<T>::Dynamic1Dim()
{
//数组的初始大小的1个T类型对象
//分配一块内存其大小为T型类所占的空间 m_pBuf = (T*)malloc(sizeof(T)); //在内存空间中建立一个T型对象 new(m_pBuf) T();
m_iSize = 1;
}//--------------------------------------------------// operator []
T& Dynamic1Dim<T>::operator [](int index)
{
// 如果下标是负值,抛出一个异常 if( index < 0 ) throw std::out_of_range(" Index shouldn\\\'\\\'t be negative"); //检查下标是否超来数组大小,如果超过则调用EnlargeDim扩大数组 if(index > m_iSize - 1)
EnlargeDim(index + 1);
Return m_pBuf [index];
}//--------------------------------------------------// EnlargeDim
bool Dynamic1Dim<T>::EnlargeDim(int iSize)
{ // 重新分配一块内存,其大小为扩大后T类型数组的大小 m_pBuf = (string*) realloc(m_pBuf, sizeof(T) * iSize); // 在扩大部分的内存空间上建立T类型的数组对象,并调用其默认构造函数 for(int i = m_iSize; i < iSize; i++)
{
new(&m_pBuf[i]) T();
} m_iSize = iSize;
return true;
}//--------------------------------------------------// Destructor
Dynamic1Dim<T>::~Dynamic1Dim()
{
// 调用T类的析构函数 for(int i = 0; i < m_iSize; i++)
{
m_pBuf [i].~T();
} // 释放内存空间
free(m_pBuf);
}其中红色的那行代码百思不得其解,往大家帮我解释一下。
解决方案 »
- 如何将char*转换为BSTR*
- 无法调试?
- NetShareAdd无法共享
- 请问一下这个软件用什么数据库比较好呢
- 在style=report的ListCtrl中加入checkbox,如何让它与实际操作结合起来?
- vc中的CString 类型是否有长度限制,我用一个很长(接近无限长)的字符串赋值给一个CString变量,会有什么问题??
- isapi的扩展程序能用msxml4.dll吗?
- IOCP Socket 缓冲区 怎样防止被操作系统锁定整个内存页
- 用DAO要从CDaoRecordset派生自己的类,如CMyDaoRecordset,vc要我选定一个表,请进。。。
- 怎样不叫MDI的子窗口自动出现,除非我按NEW
- 添加Create函数后,对话框无法显示,帮忙说一下为什么
- 怎样控制文本框的显示
1、T *pT = new T;
2、int *p = new int(5); //new后做初始化
3、new(m_pBuf) T(); //new后,调用T()具体看C++ Primer
前面不是已经realloc了空间了吗?为什么还要new啊?
new(&m_pBuf[i])T();而且&m_pBuf[i]这个也很怪啊。
还是不太明白。