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 CObject
s (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
Użyj polecenia
GetHeadPosition
iGetNext
, aby iterować po liście.delete
Użyj operatora , aby usunąć każdy obiekt, który występuje w iteracji.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
Użyj
GetSize
wartości indeksu i liczby całkowitej, aby iterować po tablicy.delete
Użyj operatora , aby usunąć każdy element, który występuje w iteracji.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
Użyj instrukcji
GetStartPosition
iGetNextAssoc
, aby iterować za pośrednictwem tablicy.delete
Użyj operatora , aby usunąć klucz i/lub wartość dla każdego elementu mapy, ponieważ występuje w iteracji.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 iCPerson
obiekt (pochodzący zCObject
) 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.