C++之MFC数据管理类CArray与CPtrList

        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





  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值