Eliminazione di tutti gli oggetti in una raccolta CObject
Questo articolo illustra come eliminare tutti gli oggetti in una raccolta (senza eliminare l'oggetto raccolta stesso).
Per eliminare tutti gli oggetti in una raccolta di CObject
oggetti (o di oggetti derivati da CObject
), utilizzare una delle tecniche di iterazione descritte nell'articolo Accesso a tutti i membri di un insieme per eliminare ogni oggetto a sua volta.
Attenzione
Gli oggetti nelle raccolte possono essere condivisi. Ovvero, la raccolta mantiene un puntatore all'oggetto, ma anche altre parti del programma possono avere puntatori allo stesso oggetto. È necessario prestare attenzione a non eliminare un oggetto condiviso fino a quando tutte le parti non sono state completate utilizzando l'oggetto .
Questo articolo illustra come eliminare gli oggetti in:
Per eliminare tutti gli oggetti in un elenco di puntatori a CObject
Usare
GetHeadPosition
eGetNext
per scorrere l'elenco.Usare l'operatore
delete
per eliminare ogni oggetto durante l'iterazione.Chiamare la
RemoveAll
funzione per rimuovere tutti gli elementi dall'elenco dopo l'eliminazione degli oggetti associati a tali elementi.
Nell'esempio seguente viene illustrato come eliminare tutti gli oggetti da un elenco di CPerson
oggetti . Ogni oggetto nell'elenco è un puntatore a un CPerson
oggetto originariamente allocato nell'heap.
CTypedPtrList<CObList, CPerson*> myList;
CPerson* pPerson = new CPerson();
myList.AddHead(pPerson);
POSITION pos = myList.GetHeadPosition();
while (pos != NULL)
{
delete myList.GetNext(pos);
}
myList.RemoveAll();
L'ultima chiamata di funzione, RemoveAll
, è una funzione membro di elenco che rimuove tutti gli elementi dall'elenco. La funzione RemoveAt
membro rimuove un singolo elemento.
Si noti la differenza tra l'eliminazione dell'oggetto di un elemento e la rimozione dell'elemento stesso. La rimozione di un elemento dall'elenco rimuove semplicemente il riferimento dell'elenco all'oggetto . L'oggetto esiste ancora in memoria. Quando si elimina un oggetto, smette di esistere e la relativa memoria viene recuperata. È quindi importante rimuovere un elemento immediatamente dopo l'eliminazione dell'oggetto dell'elemento in modo che l'elenco non tenti di accedere agli oggetti che non esistono più.
Per eliminare tutti gli elementi in una matrice
Usare
GetSize
e valori di indice integer per scorrere la matrice.Usare l'operatore
delete
per eliminare ogni elemento durante l'iterazione.Chiamare la
RemoveAll
funzione per rimuovere tutti gli elementi dalla matrice dopo l'eliminazione.Il codice per eliminare tutti gli elementi di una matrice è il seguente:
CArray<CPerson*, CPerson*> myArray; int i = 0; while (i < myArray.GetSize()) { delete myArray.GetAt(i++); } myArray.RemoveAll();
Come nell'esempio di elenco precedente, è possibile chiamare RemoveAll
per rimuovere tutti gli elementi in una matrice o RemoveAt
per rimuovere un singolo elemento.
Per eliminare tutti gli elementi in una mappa
Usare
GetStartPosition
eGetNextAssoc
per scorrere la matrice.Usare l'operatore
delete
per eliminare la chiave e/o il valore per ogni elemento della mappa durante l'iterazione.Chiamare la
RemoveAll
funzione per rimuovere tutti gli elementi dalla mappa dopo l'eliminazione.Il codice per eliminare tutti gli elementi di una
CMap
raccolta è il seguente. Ogni elemento della mappa ha una stringa come chiave e unCPerson
oggetto (derivato daCObject
) come valore.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();
È possibile chiamare RemoveAll
per rimuovere tutti gli elementi in una mappa o RemoveKey
per rimuovere un singolo elemento con la chiave specificata.