吵吵   2014-12-13  阅读:2,249

CObList是MFC中应用的比较多的链表,除了能够常规的增加、删除元素外,最重要的是,任何继承自CObject的类都可以添加进链表。

因此当我们用到CObList的时候,才有点像用到delphi的TObjectList,继承自TObject类的指针可以任意转换。

当然,在索引等操作上,还是没有delphi的链表方便。

1、基本用法。

基本用法不细说,自己体会,以下是循环示例:

 POSITION pos = cObList.GetHeadPosition();
{
  CNode* pObject = (CNode*)pcObList.GetNext(at);

  // do some thing
  pcObList.GetNext(pos);

}

2、delete 是否释放了内存。

按照官方的说法,delete链表指针只会释放该链表本身,而里面的元素则不会释放,我想这点应该是不用质疑的。

3、removeAll是否释放了里面的元素呢?

这个我们得测试一下:

CObList * list=new CObList();
for(int i=0;i<10000;i++)

{
	AObject* a=new AObject();
	list->AddTail(a);
}
AfxMessageBox("添加");

list->RemoveAll();

事实证明RemoveAll还是仅仅清理了指针而已,没有就将元素释放。

4、如何释放链表中的元素?那就只有手动delete了

POSITION pos= list->GetHeadPosition();
	
	while (pos!=NULL)
	{
		delete list->GetAt(pos);
		 list->GetNext(pos);
	}
	
	list->RemoveAll();
	delete list;

5、类中的CString会不会随delte而释放呢?

CString由于使用方便会在类中大量应用,但是当B类的元素直接=A类的元素的时候,当A类被delete的时候,B类的元素还有么?

如:

	AObject* a=new AObject();
	a->A="niemeia";
	
	BObject * b=new BObject();
	b->B=a->A;

	delete a;
	AfxMessageBox(b->B);

事实证明,这个对话框弹出来的还是 “nimeia” 为什么会这样?因为CString虽然只是个指针的,但是却有引用计数的方法来判断什么时候释放。

因此上面的代码可以解释为:

a->A=”niemeia”; 引用计数为1

b->B=a->A; 引用计数为2

delete a; 引用计数-1,也就是为1

6、你确定当delete a的时候,a类里面的CString元素 A 会被释放么?

可以用以下的代码测试:

	AObject* a=new AObject();
	a->A="niemeia";
	AObject* a1=a;
	delete a;
	AfxMessageBox(a1->A);

这时候你会发现,报错了, a1里面压根没有CString类型的A了!!!

7、CString虽然好用,如果类里面有CString,尤其注意避免直接类之间的指针赋值!,这样子CString的引用计数是不会增加的!!!如上的例子,你要这么写代码就是很危险事情了!

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

发表评论

电子邮件地址不会被公开。 必填项已用*标注