Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í, 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
Použijte
GetHeadPosition
aGetNext
iterujte seznamem.Pomocí operátoru
delete
odstraňte každý objekt, jakmile na něj narazíte při 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, 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
Použijte
GetSize
a celočíselné hodnoty indexu k iteraci přes pole.Pomocí operátoru
delete
odstraňte každý prvek, jakmile je nalezen 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 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ě
Použijte
GetStartPosition
aGetNextAssoc
, abyste iterovali polem.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.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íč 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 zavolat RemoveAll
k odebrání všech prvků v mapě nebo zavolat RemoveKey
k odebrání jednotlivého prvku se zadaným klíčem.