Suppression de tous les objets d’une collection CObject
Cet article explique comment supprimer tous les objets d’une collection (sans supprimer l’objet collection lui-même).
Pour supprimer tous les objets d’une collection de CObject
s (ou d’objets dérivés de ), CObject
vous utilisez l’une des techniques d’itération décrites dans l’article Accès à tous les membres d’une collection pour supprimer à son tour chaque objet.
Attention
Les objets au sein des collections peuvent être partagés. Autrement dit, la collection conserve un pointeur vers l'objet, mais d'autres parties du programme peuvent également avoir des pointeurs sur le même objet. Vous devez alors veiller à ne pas supprimer un objet qui est partagé jusqu'à ce que toutes les parties aient fini d'utiliser l'objet.
Cet article explique comment supprimer des objets dans :
Pour supprimer tous les objets d’une liste de pointeurs vers CObject
Utilisez
GetHeadPosition
etGetNext
pour parcourir la liste.Utilisez l’opérateur
delete
pour supprimer chaque objet tel qu’il est rencontré dans l’itération.Appelez la fonction
RemoveAll
pour supprimer tous les éléments dans la liste une fois que les objets associés à ces éléments ont été supprimés.
L'exemple suivant montre comment supprimer tous les objets d'une liste d'objets CPerson
. Chaque objet de la liste est un pointeur vers un objet CPerson
qui a été initialement alloué sur le tas.
CTypedPtrList<CObList, CPerson*> myList;
CPerson* pPerson = new CPerson();
myList.AddHead(pPerson);
POSITION pos = myList.GetHeadPosition();
while (pos != NULL)
{
delete myList.GetNext(pos);
}
myList.RemoveAll();
Le dernier appel de fonction, RemoveAll
, est une fonction membre de la liste qui supprime tous les éléments de la liste. La fonction membre RemoveAt
supprime un élément.
Notez la différence entre supprimer l'élément d'un objet et supprimer l'élément lui-même. Supprimer un élément de la liste supprime uniquement la référence de la liste à l'objet. L'objet existe encore en mémoire. Lorsque vous supprimez un objet, il arrête d'exister et sa mémoire est libérée. Par conséquent, il est important de supprimer un élément dès que l'objet de l'élément a été supprimé afin que la liste ne tente pas d'accéder aux objets qui n'existent plus.
Pour supprimer tous les éléments d’un tableau
Utilisez
GetSize
et des valeurs d'index entiers pour effectuer une itération au sein du tableau.Utilisez l’opérateur
delete
pour supprimer chaque élément tel qu’il est rencontré dans l’itération.Appelez la fonction
RemoveAll
pour supprimer tous les éléments du tableau après leur suppression.Le code pour supprimer tous les éléments d'un tableau est le suivant :
CArray<CPerson*, CPerson*> myArray; int i = 0; while (i < myArray.GetSize()) { delete myArray.GetAt(i++); } myArray.RemoveAll();
Comme dans l'exemple de liste ci-dessus, vous pouvez appeler RemoveAll
pour supprimer tous les éléments d'un tableau ou RemoveAt
pour supprimer chaque élément un par un.
Pour supprimer tous les éléments d’une carte
Utilisez
GetStartPosition
etGetNextAssoc
pour effectuer une itération au sein du tableau.Utilisez l’opérateur
delete
pour supprimer la clé et/ou la valeur de chaque élément de carte tel qu’il est rencontré dans l’itération.Appelez la fonction
RemoveAll
pour supprimer tous les éléments du mappage après leur suppression.Le code pour supprimer tous les éléments d’une collection
CMap
est le suivant. Chaque élément du mappage a une chaîne en tant que clé et un objetCPerson
(dérivé deCObject
) en tant que valeur.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();
Vous pouvez appeler RemoveAll
pour supprimer tous les éléments d'un mappage ou RemoveKey
pour supprimer chaque élément avec la clé spécifiée.