Udostępnij za pośrednictwem


Usuwanie wszystkich obiektów z kolekcji CObject

W tym artykule wyjaśniono, jak usunąć wszystkie obiekty w kolekcji (bez usuwania samego obiektu kolekcji).

Aby usunąć wszystkie obiekty w kolekcji CObjects (lub obiektów pochodzących z CObject), należy użyć jednej z technik iteracji opisanych w artykule Uzyskiwanie dostępu do wszystkich elementów członkowskich kolekcji w celu usunięcia każdego obiektu po kolei.

Uwaga

Obiekty w kolekcjach można udostępniać. Oznacza to, że kolekcja przechowuje wskaźnik do obiektu, ale inne części programu mogą również mieć wskaźniki do tego samego obiektu. Należy zachować ostrożność, aby nie usunąć obiektu, który jest udostępniany, dopóki wszystkie części nie zakończą korzystania z obiektu.

W tym artykule pokazano, jak usunąć obiekty w:

Aby usunąć wszystkie obiekty na liście wskaźników do obiektu CObject

  1. Użyj polecenia GetHeadPosition i GetNext , aby iterować po liście.

  2. delete Użyj operatora , aby usunąć każdy obiekt, który występuje w iteracji.

  3. Wywołaj funkcję , RemoveAll aby usunąć wszystkie elementy z listy po usunięciu obiektów skojarzonych z tymi elementami.

W poniższym przykładzie pokazano, jak usunąć wszystkie obiekty z listy CPerson obiektów. Każdy obiekt na liście jest wskaźnikiem CPerson do obiektu, który został pierwotnie przydzielony na stercie.

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

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

Ostatnie wywołanie funkcji, RemoveAll, jest funkcją składową listy, która usuwa wszystkie elementy z listy. Funkcja RemoveAt składowa usuwa pojedynczy element.

Zwróć uwagę na różnicę między usunięciem obiektu elementu a usunięciem samego elementu. Usunięcie elementu z listy spowoduje jedynie usunięcie odwołania listy do obiektu. Obiekt nadal istnieje w pamięci. Po usunięciu obiektu przestanie istnieć, a jego pamięć zostanie odzyskana. Dlatego ważne jest, aby usunąć element natychmiast po usunięciu obiektu elementu, aby lista nie próbowała uzyskać dostępu do obiektów, które już nie istnieją.

Aby usunąć wszystkie elementy w tablicy

  1. Użyj GetSize wartości indeksu i liczby całkowitej, aby iterować po tablicy.

  2. delete Użyj operatora , aby usunąć każdy element, który występuje w iteracji.

  3. Wywołaj funkcję , RemoveAll aby usunąć wszystkie elementy z tablicy po ich usunięciu.

    Kod usuwania wszystkich elementów tablicy jest następujący:

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

Podobnie jak w powyższym przykładzie listy, można wywołać metodę RemoveAll , aby usunąć wszystkie elementy w tablicy lub RemoveAt usunąć pojedynczy element.

Aby usunąć wszystkie elementy na mapie

  1. Użyj instrukcji GetStartPosition i GetNextAssoc , aby iterować za pośrednictwem tablicy.

  2. delete Użyj operatora , aby usunąć klucz i/lub wartość dla każdego elementu mapy, ponieważ występuje w iteracji.

  3. Wywołaj funkcję , RemoveAll aby usunąć wszystkie elementy z mapy po ich usunięciu.

    Kod usuwania wszystkich elementów CMap kolekcji jest następujący. Każdy element na mapie ma ciąg jako klucz i CPerson obiekt (pochodzący z CObject) jako wartość.

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

Możesz wywołać metodę RemoveAll , aby usunąć wszystkie elementy na mapie lub RemoveKey usunąć pojedynczy element z określonym kluczem.

Zobacz też

Uzyskiwanie dostępu do wszystkich składowych kolekcji