删除 CObject 集合中的所有对象

本文介绍如何删除集合中的所有对象(而不删除集合对象本身)。

要删除 CObject 集合中的所有对象(或派生自 CObject 的所有对象),可使用访问集合的所有成员一文中描述的一种迭代方法来依次删除每个对象。

注意

集合中的对象可以共享。 也就是说,集合将保留指向对象的指针,但程序的其他部分也可能具有指向同一对象的指针。 在使用共享对象删除所有部分之前,您必须小心以免删除此对象。

本文演示如何在下列内容中删除对象:

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

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

  2. 使用 delete 运算符删除迭代中遇到的每个对象。

  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. 使用 delete 运算符删除迭代中遇到的每个元素。

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

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

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

与上述列表示例一样,您可调用 RemoveAll 删除数组中的所有元素或调用 RemoveAt 删除独立元素。

删除映射中的所有元素

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

  2. 使用 delete 运算符删除迭代中遇到的每个映射元素的键和/或值。

  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();
    

您可以调用 RemoveAll 删除映射中的所有元素或调用 RemoveKey 删除具有指定键的独立元素。

另请参阅

访问集合的所有成员