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.

Nota di avvisoAttenzione

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

  1. Utilizzo GetHeadPosition e GetNext scorrere l'elenco.

  2. Utilizzare l'operatore delete per eliminare ogni oggetto come viene visualizzato nell'iterazione.

  3. 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

  1. Utilizzare GetSize e i valori di indice Integer per scorrere la matrice.

  2. Utilizzare l'operatore delete per eliminare ogni elemento come viene visualizzato nell'iterazione.

  3. 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

  1. Utilizzare GetStartPosition e GetNextAssoc per scorrere la matrice.

  2. Utilizzare l'operatore delete per eliminare la chiave e/o il valore per ogni elemento mapping come viene visualizzato nell'iterazione.

  3. 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.

Vedere anche

Attività

Accedere a tutti i membri di una raccolta