删除在CObject集合中的任何对象
本文说明如何删除集合中的所有对象 (不删除集合对象)。
若要删除在 CObject的集合的所有对象 (从 CObject派生的或对象),则使用该文章描述的一个迭代技术 访问集合的所有成员 依次删除每个对象。
警告
集合中的对象可以共享。即集合保留指向对象的指针,但是,程序的其他部分还可以使指针指向同一对象。您必须小心不删除使用对象,共享的对象,直到所有部件完成。
本文演示如何删除对象中:
一个列表
数组
映射
删除指针上列出的所有对象。 CObject
使用 GetHeadPosition 和 GetNext 通过列表重复。
使用 delete delete 运算符每个对象,它在迭代遇到。
调用 RemoveAll 函数从列表中移除所有元素都对象之后与这些元素已被删除。
下面的示例演示如何从 CPerson 对象列表中删除所有对象。 在列表中的每个对象是指向堆中最初分配的 CPerson 对象。
CTypedPtrList<CObList, CPerson*> myList;
CPerson* pPerson = new CPerson();
myList.AddHead(pPerson);
POSITION pos = myList.GetHeadPosition();
while(pos != NULL)
{
delete myList.GetNext(pos);
}
myList.RemoveAll();
最后一个函数调用, RemoveAll,是从列表中移除所有元素的 " 列出成员 " 功能。 成员函数 RemoveAt 移除一个元素。
请注意在删除元素的对象和移除元素之间的区别。 移除元素从列表仅移除列表的对对象的引用。 对象仍存在于内存。 当删除对象时,它不再存在,并回收其内存。 因此,移除元素是重要的,在元素的对象中删除之后,以便该列表不会尝试访问不存在的对象。
删除数组中的所有元素
使用 GetSize 和整数索引值将数组重复。
使用 delete delete 运算符每个元素,它在迭代遇到。
,在将删除后,调用 RemoveAll 函数从数组中移除所有元素。
删除数组的所有元素代码如下所示:
CArray<CPerson*, CPerson*> myArray; int i = 0; while (i < myArray.GetSize()) { delete myArray.GetAt(i++); } myArray.RemoveAll();
使用上面的示例列表,可以调用 RemoveAll 移除对数组或 RemoveAt 的所有元素中移除单个元素。
在删除映射的所有元素
使用 GetStartPosition 和 GetNextAssoc 将数组重复。
使用 delete delete 运算符键和值每个映射元素的,它在迭代遇到。
,在将删除后,调用 RemoveAll 函数从映射中移除所有元素。
删除的 CMap 集合的所有元素代码如下所示。 在映射的每个元素都具有一个字符串作为键和 CPerson 对象 (从派生 CObject) 作为值。
CMap<CString, LPCTSTR, CPerson*, CPerson*> myMap; // ... Add some key-value elements ... // Now delete the elements POSITION pos = myMap.GetStartPosition(); while(pos != NULL) { CPerson* pPerson; CString string; // Gets key (string) and value (pPerson) myMap.GetNextAssoc(pos, string, pPerson); delete pPerson; } // RemoveAll deletes the keys myMap.RemoveAll();
可以调用 RemoveAll 移除映射或 RemoveKey 的所有元素中移除单个元素具有指定键的。