supprimer tous les objets dans une collection de 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 dans une collection de CObject (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 chaque objet.
Avertissement
Les objets dans les 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 :
Une liste
Un tableau.
Une map
Pour supprimer tous les objets d'une liste de pointeurs vers CObject
Utilisez GetHeadPosition et GetNext pour parcourir la liste.
Utilisez l'opérateur supprimer pour supprimer chaque objet tel qu'il est trouvé 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 seulement 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 indices entiers pour itérer au sein de le tableau.
Utilisez l'opérateur supprimer pour supprimer chaque élément tel qu'il est trouvé dans l'itération.
Appelez la fonction RemoveAll pour supprimer tous les éléments du tableau après qu'ils ont été supprimés.
Le code pour supprimer tous les éléments d'un tableau est comme suit :
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 un élément individuel.
Pour supprimer tous les éléments d'une map
Utilisez GetStartPosition et GetNextAssoc pour parcourir le tableau.
Utilisez l'opérateur supprimer pour supprimer la clé et/ou la valeur de chaque élément de carte tel qu'il est produit dans l'itération.
Appelez la fonction RemoveAll pour supprimer tous les éléments de la map après qu'ils ont été supprimés.
Le code pour supprimer tous les éléments d'une collection CMap est comme suit. Chaque élément de la map a une chaîne comme clé et un objet CPerson (dérivés de CObject) comme 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'une map ou RemoveKey pour supprimer un élément individuel avec la clé spécifiée.