Condividi tramite


Eliminazione di tutti gli oggetti in una raccolta 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 ogni oggetto alla volta.

Avviso

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 completato utilizzo dell'oggetto.

In questo articolo viene illustrato come eliminare gli oggetti in:

  • Un elenco

  • Una matrice

  • Una mappa

Per rimuovere tutti gli oggetti in un elenco dei puntatori a CObject

  1. Utilizzo GetHeadPosition e GetNext scorrere l'elenco.

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

  3. Chiamare la funzione di RemoveAll per rimuovere tutti gli elementi dall'elenco dopo gli oggetti associati agli elementi eliminati.

Nell'esempio seguente viene illustrato come rimuovere tutti gli oggetti da un elenco di CPerson oggetti. Ogni oggetto nell'elenco è un puntatore a un oggetto di CPerson che è stato originariamente l'heap nativo.

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. Rimuove un elemento dall'elenco vengono rimossi solo il riferimento all'elenco all'oggetto. L'oggetto esiste ancora in memoria. Quando si elimina un oggetto, cessa di esistere e la memoria viene recuperata. Pertanto, è importante rimuovere un elemento immediatamente dopo che l'oggetto dell'elemento eliminato in modo che l'elenco non tentare di accedere agli oggetti che non esistono più.

Per rimuovere tutti gli elementi di una matrice

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

  2. Utilizzare l'operatore di eliminazione per eliminare tutte le voci come viene visualizzato nell'iterazione.

  3. Chiamare la funzione di RemoveAll per rimuovere tutti gli elementi dalla 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 di una matrice o in RemoveAt per rimuovere un singolo elemento.

Per rimuovere tutti gli elementi in una mappa

  1. Utilizzare GetStartPosition e GetNextAssoc per scorrere la matrice.

  2. Utilizzare l'operatore di eliminazione per eliminare la chiave e/o un valore per ogni elemento della mappa come viene visualizzato nell'iterazione.

  3. Chiamare la funzione di RemoveAll per rimuovere tutti gli elementi dalla mappa dopo che sono stati eliminati.

    Il codice per rimuovere tutti gli elementi di una raccolta di CMap è il seguente. Ogni elemento nella mappa contiene una stringa come chiave e 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 una mappa o in RemoveKey per rimuovere un singolo elemento alla chiave specificata.

Vedere anche

Attività

Accesso a tutti i membri di una raccolta