MFC的数组类可以存放任何数据类型,MFC数组类创建的对象可以根据需要动态地增大或减小,数组的起始下标是0,而上限可以是固定的,也可以随着元素的增加而增加,在使用之前,最好使用SetSize建立它的大小和为它分配内存,否则添加元素时会引起频繁地重新分配和拷贝,不但没有效率,而且导致内存碎片。
MFC定义了数组模板类CArray,并针对各种常用变量类型定义了CByteArray,CArray,CUIntArray,CDArray,CStringArray,CObArray,CPtrArray,所有类操作基本一致。具体可参见CSDN中说明。
数组类中若存放的是指针元素或者结构体中含有指针的需要遵循“先释放内存再删除元素”的原则。另外数组类中重载了“[]”,可与常规数组一样访问数组中元素,也可通过ElementAt()函数访问,该函数返回数组元素类型的指针。示例代码:
int nCount = 0;
nCount = m_arrTest.GetCount();
for(int i=0;i<nCount;i++)
{
m_arrTest[i].num = 1;
m_arrTest.ElementAt(i)->num = 2;
}
CList是通用型的列表类,你可以存放指定的数据类型,用法如下:CList<CPoint, CPoint&> list;这样就指定了CList中存放的是CPoint类型的引用;
CPtrList,CObList,CStringList都是具体的用于某种类型的集合类型而CPtrList存放的是void类型的指针,取出的时候必须要强制转换;CObList用于存放从CObject派生的数据类型的指针;CStringList存放CString字符串类型,相当于CList<Cstring,CString>
由于CPtrList中存放的是指针,因此当一个CPtrList对象被删除或者其元素被删除时,仅删除指针,但是指针所引用的实体并没有被删除,因此在删除对象时需要手动释放内存,防止内存泄露。遵循先释放内存再删除对象的原则。
struct _ST_CPTRLIST
{
int nTest;
char szStr[50];
char* strTest;
};
CPtrList m_PtrList;
void AddElement(_ST_CPTRLIST* pstuData)
{
if(pstuData != NULL)
{
m_PtrList.AddTail(pstuData);
return;
}
}
void DeleteElement( _ST_CPTRLIST* pstuData )
{
POSITION pos,Temppos;
pos = m_PtrList.GetHeadPosition();
while(pos)
{
Temppos = pos;
_ST_CPTRLIST* pstuFind = (_ST_CPTRLIST*)m_PtrList.GetNext(pos);
if( pstuData->nTest == pstuFind->nTest )
{
if(pstuFind)
{
if(pstuFind->strTest)
{
delete []pstuFind->strTest;
pstuFind->strTest = NULL;
}
delete pstuFind;
pstuFind = NULL;
}
m_PtrList.RemoveAt(Temppos); // 后续元素自动前移
}
}
}
void DeleteAllElement( )
{
POSITION pos;
pos = m_PtrList.GetHeadPosition();
while(pos)
{
_ST_CPTRLIST* pstuData = (_ST_CPTRLIST*)m_PtrList.GetNext(pos);
if(pstuData)
{
if(pstuData->strTest)
{
delete []pstuData->strTest;
pstuData->strTest = NULL;
}
delete pstuData;
pstuData = NULL;
}
}
m_PtrList.RemoveAll(); //删除元素前先释放内存
}
本人水平有限,欢迎有问题批评指定,多多交流。
http://blog.csdn.net/bodogbo11/article/details/8004776
http://blog.csdn.net/password318/article/details/6858647