删除 CObject 集合中的所有对象

本文说明如何删除集合中的所有对象 (不删除集合对象)。

若要删除 CObject的集合的任何对象 (从 CObject派生的或对象),可以使用文中描述的一个迭代技术 访问集合的所有成员。 依次删除每个对象。

警告

集合中的对象可以共享。也就是说集合保留一个指向对象,但是,程序的其他任何部分还可以指向同一对象。您必须小心不删除对象,使用共享的对象,直到所有部件完成。

本文演示如何删除对象中:

  • 一个列表

  • 数组。

  • 映射

删除指针的所有对象。CObject 列表

  1. 使用 GetHeadPositionGetNext 循环访问该列表。

  2. 使用 删除 运算符来删除每个对象,它在一个迭代时。

  3. 否则,在对象与这些元素被删除后,请调用 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 移除一个元素。

要注意删除元素对象和移除元素之间的区别。 移除元素从列表仅移除对该对象的引用的列表。 对象保留在内存中。 则删除对象时,它将会停止存在,其内存回收。 因此,移除元素很重要,在元素的对象删除之后,以便该列表不会尝试访问不存在的对象。

删除数组中的所有元素

  1. 使用 GetSize 和整数直至循环访问数组。

  2. 使用 删除 运算符来删除每个元素,它在一个迭代时。

  3. 在删除后,请调用 RemoveAll 函数从数组中移除所有元素。

    删除数组的所有元素代码如下所示:

    CArray<CPerson*, CPerson*> myArray;
    
    int i = 0;
    while (i < myArray.GetSize())
    {
       delete myArray.GetAt(i++);
    }
    
    myArray.RemoveAll();        
    

使用上面的示例的列表,您可以调用 RemoveAllRemoveAt 的数组中移除所有元素中移除单个元素。

在删除映射的所有元素

  1. 使用 GetStartPositionGetNextAssoc 循环访问该数组。

  2. 使用 删除 运算符、键和值每个映射元素的,在遇到迭代。

  3. 在删除后,请调用 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();      
    

可以移除映射在调用 RemoveAllRemoveKey 的所有元素中移除单个元素具有指定键的。

请参见

任务

访问集合的所有成员