关于模板链表类中释放内存时,数据域存在两种情况
1.是指针类型:如QList<Student*> stuList;
2.是不是指针类型.如
QList<int> intList;
所以在释放内存是也有两种情况:
1.如果是指针类型,就要删除数据域指针指向的内存,再删除节点内存
delete pCur->data;
delete pCur;
2.不是指针类型的就只删除节点内存
delete pCur;
问题就来了,如何判断模板类型是否是指针类型呢?
可以通过typeid函数来获得类型的名称,通过判断名称最后一个字符是否是*来判断
实例:
Student 是个结构体
在链表类构造的时候:
//模板链表类
template<typename T>
class QList
{
public:
QList()
{
const char* pChar=typeid(T).name(); //获得类型T的名称
int nLen=strlen(pChar);
if(pChar[nLen-1]=='*')
m_bPtr=true; //是指针类型
else
m_bPtr=false; //不是指针类型
}
//...
};
要用typeid 要添加头文件: #include <typeinfo.h>
如果链表定义的时候:
QList<Student> stuList;
通过typeid获得的类型名称为: struct Student
QList<Student*> stuList;
通过typeid获得的类型名称为: struct Student*
通过对类型的判断来释放内存
template<typename T>
QList::~QList()
{
if (m_bPtr) //记录是否是指针类型
ClearAll(); //清除数据域指针指向的内存和节点内存
else
ClearNode(); //只清除节点内存
}