Sdílet prostřednictvím


Smazání všech objektů v kolekcích CObject

Tento článek vysvětluje, jak odstranit všechny objekty v kolekci (bez odstranění samotného objektu kolekce).

Chcete-li odstranit všechny objekty v kolekci CObjectobjektů (nebo z objektů odvozených z CObject), použijte jednu z technik iterace popsaných v článku Přístup ke všem členům kolekce , abyste odstranili jednotlivé objekty.

Upozornění

Objekty v kolekcích lze sdílet. To znamená, že kolekce uchovává ukazatel na objekt, ale ostatní části programu mohou mít také ukazatele na stejný objekt. Musíte být opatrní, abyste neodstranili objekt, který je sdílený, dokud se všechny části nedokončily používáním objektu.

V tomto článku se dozvíte, jak odstranit objekty v:

Odstranění všech objektů v seznamu ukazatelů na objekt CObject

  1. Použijte GetHeadPosition a GetNext iterujte seznamem.

  2. Pomocí operátoru delete odstraňte každý objekt, protože je zjištěn v iteraci.

  3. RemoveAll Voláním funkce odeberete všechny prvky ze seznamu po odstranění objektů přidružených k těmto prvkům.

Následující příklad ukazuje, jak odstranit všechny objekty ze seznamu CPerson objektů. Každý objekt v seznamu je ukazatel na CPerson objekt, který byl původně přidělen na haldě.

CTypedPtrList<CObList, CPerson*> myList;
CPerson* pPerson = new CPerson();
myList.AddHead(pPerson);
POSITION pos = myList.GetHeadPosition();

while (pos != NULL)
{
   delete myList.GetNext(pos);
}
myList.RemoveAll();

Poslední volání funkce je člen funkce seznamu, RemoveAllkterá odebere všechny prvky ze seznamu. Členová funkce RemoveAt odebere jeden prvek.

Všimněte si rozdílu mezi odstraněním objektu elementu a odebráním samotného prvku. Odebrání elementu ze seznamu pouze odebere odkaz seznamu na objekt. Objekt stále existuje v paměti. Když odstraníte objekt, přestane existovat a jeho paměť se uvolní. Proto je důležité odebrat prvek ihned po odstranění objektu elementu, aby se seznam nepokoušel získat přístup k objektům, které již neexistují.

Odstranění všech prvků v poli

  1. Hodnoty indexu celého čísla slouží GetSize k iteraci pole.

  2. Pomocí operátoru delete odstraňte každý prvek, protože je zjištěn v iteraci.

  3. RemoveAll Voláním funkce odeberete všechny prvky z pole po jejich odstranění.

    Kód pro odstranění všech prvků pole je následující:

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

Stejně jako u výše uvedeného příkladu seznamu můžete volat RemoveAll odebrání všech prvků v poli nebo RemoveAt odebrání jednotlivých prvků.

Odstranění všech prvků v mapě

  1. Použijte GetStartPosition a GetNextAssoc iterujte polem.

  2. Pomocí operátoru delete odstraňte klíč a/nebo hodnotu pro každý prvek mapování, protože je zjištěn v iteraci.

  3. Voláním RemoveAll funkce odeberete všechny prvky z mapy po odstranění.

    Kód pro odstranění všech prvků CMap kolekce je následující. Každý prvek v mapě má řetězec jako klíč a CPerson objekt (odvozený z CObject) jako hodnotu.

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

Můžete volat RemoveAll odebrání všech prvků v mapě nebo RemoveKey odebrání jednotlivých prvků se zadaným klíčem.

Viz také

Přístup ke všem členům kolekce