Eliminare tutti gli oggetti in una raccolta di CObject
In questo articolo viene illustrato come rimuovere tutti gli oggetti in una raccolta (senza eliminare l'oggetto Collection stesso).
Per eliminare tutti gli oggetti in una raccolta di CObjects (o di oggetti derivati da CObject), utilizzare una delle tecniche di iterazione descritte nell'articolo Accedere a tutti i membri di una raccolta per eliminare ciascun oggetto alla volta.
Attenzione |
---|
Gli oggetti nelle raccolte possono essere condivisi.Ovvero la raccolta mantiene un puntatore all'oggetto, ma altre parti del programma possono inoltre essere puntatori allo stesso oggetto.È necessario prestare attenzione a non eliminare un oggetto che sia condiviso finché tutte le parti non ha terminato l'utilizzo dell'oggetto. |
In questo articolo viene illustrato come eliminare gli oggetti in:
Un elenco
Una matrice
Un mapping
Per eliminare tutti gli oggetti in un elenco dei puntatori a CObject
Utilizzo GetHeadPosition e GetNext scorrere l'elenco.
Utilizzare l'operatore delete per eliminare ogni oggetto come viene visualizzato nell'iterazione.
Chiamare la funzione di RemoveAll per rimuovere tutti gli elementi dall'elenco dopo che gli oggetti associati agli elementi eliminati.
Nell'esempio seguente viene illustrato come rimuovere tutti gli oggetti da un elenco di CPerson oggetti.Ogni oggetto elenco è un puntatore a un oggetto di CPerson in cui è stato 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 list che rimuove tutti gli elementi dall'elenco.La funzione membro RemoveAt rimuove un singolo elemento.
Si noti la differenza tra eliminare l'oggetto di un elemento e rimuovere l'elemento stesso.Rimozione di un elemento dall'elenco solo rimuove il riferimento dell'elenco all'oggetto.L'oggetto esiste ancora in memoria.Quando si elimina un oggetto, viene interrotta di esistere e la memoria viene recuperata.Pertanto, è importante eliminare un elemento subito dopo che l'oggetto dell'elemento è stato eliminato in modo che l'elenco non tenti di accedere agli oggetti che non esistono più.
Per rimuovere tutti gli elementi in una matrice
Utilizzare GetSize e i valori di indice Integer per scorrere la matrice.
Utilizzare l'operatore delete per eliminare ogni elemento come viene visualizzato nell'iterazione.
Chiamare la funzione di RemoveAll per eliminare tutti gli elementi della matrice dopo che sono stati eliminati.
Il codice per rimuovere tutti gli elementi di una matrice è la seguente:
CArray<CPerson*, CPerson*> myArray; int i = 0; while (i < myArray.GetSize()) { delete myArray.GetAt(i++); } myArray.RemoveAll();
Come con l'esempio dell'elenco precedente, è possibile chiamare RemoveAll per rimuovere tutti gli elementi in una matrice o in RemoveAt per eliminare un singolo elemento.
Per rimuovere tutti gli elementi in un mapping
Utilizzare GetStartPosition e GetNextAssoc per scorrere la matrice.
Utilizzare l'operatore delete per eliminare la chiave e/o il valore per ogni elemento mapping come viene visualizzato nell'iterazione.
Chiamare la funzione di RemoveAll per rimuovere tutti gli elementi dal mapping dopo che sono stati eliminati.
Il codice per rimuovere tutti gli elementi di una raccolta di CMap è indicato di seguito.Ogni elemento nella mappa contiene una stringa come chiave e un oggetto di CPerson (derivati da CObject) 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 un mapping o in RemoveKey per eliminare un singolo elemento con la chiave specificata.