Sdílet prostřednictvím


Odstranění všech objektů v kolekci 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í, aby nedošlo k odstranění objektu, který je sdílený, dokud všechny části nepřestanou objekt používat.

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, jakmile na něj narazíte při 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, RemoveAll, je členská funkce seznamu, která odstraní 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. Použijte GetSize a celočíselné hodnoty indexu k iteraci přes pole.

  2. Pomocí operátoru delete odstraňte každý prvek, jakmile je nalezen 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 použít RemoveAll pro odebrání všech prvků v poli nebo RemoveAt pro odebrání jednotlivého prvku.

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

  1. Použijte GetStartPosition a GetNextAssoc, abyste iterovali polem.

  2. Použijte operátor delete k odstranění klíče a/nebo hodnoty pro každý prvek mapy, jak je zpracováván během iterace.

  3. Voláním funkce RemoveAll odeberete z mapy všechny prvky po jejich 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 zavolat RemoveAll k odebrání všech prvků v mapě nebo zavolat RemoveKey k odebrání jednotlivého prvku se zadaným klíčem.

Viz také

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