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 CObject
objektů (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
Použijte
GetHeadPosition
aGetNext
iterujte seznamem.Pomocí operátoru
delete
odstraňte každý objekt, protože je zjištěn v iteraci.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, RemoveAll
která 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
Hodnoty indexu celého čísla slouží
GetSize
k iteraci pole.Pomocí operátoru
delete
odstraňte každý prvek, protože je zjištěn v iteraci.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ě
Použijte
GetStartPosition
aGetNextAssoc
iterujte polem.Pomocí operátoru
delete
odstraňte klíč a/nebo hodnotu pro každý prvek mapování, protože je zjištěn v iteraci.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íč aCPerson
objekt (odvozený zCObject
) 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.