Effacer tous les objets dans une collection de CObject
Cet article explique comment supprimer tous les objets dans une collection (sans supprimer l'objet de collection lui-même).
Pour supprimer tous les objets d'une collection d' CObjects (ou des objets dérivés d' CObject), utilisez une des techniques d'itération décrites dans l'article accès de tous les membres d'une collection pour supprimer chaque objet après.
Attention |
---|
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 vers le même objet.Vous devez faire attention à ne pas supprimer un objet qui est partagé jusqu'à ce que toutes les parties aient terminé d'utiliser l'objet. |
Cet article explique comment supprimer des objets dans :
Une liste
Un tableau
Une carte
Pour supprimer tous les objets dans une liste de pointeurs vers CObject
Utilisez GetHeadPosition et GetNext pour itérer au sein de la liste.
Utilisez l'opérateur de suppression pour supprimer chaque objet comme il est produit dans l'itération.
Appelez la fonction d' RemoveAll pour supprimer tous les éléments de la liste une fois les objets associés à ces éléments ont été supprimés.
L'exemple suivant indique comment supprimer tous les objets d'une liste d'objets d' CPerson .Chaque objet de la liste est un pointeur vers un objet d' 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, une fonction membre de liste qui supprime tous les éléments de la liste.La fonction membre RemoveAt supprime un seul élément.
Notez la différence entre supprimer l'objet d'un élément et supprimer l'élément lui-même.Suppression d'un élément de la liste supprime simplement la référence de la liste à l'objet.l'objet existe toujours dans la mémoire.Lorsque vous supprimez un objet, il arrête à partir d'un existant et sa mémoire libérée.Par conséquent, il est important de supprimer un élément juste aprè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 les valeurs d'index d'entiers pour itérer au sein de le tableau.
Utilisez l'opérateur de suppression pour supprimer chaque élément comme il est produit dans l'itération.
Appelez la fonction d' 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 la suivante :
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 dans une carte
Utilisez GetStartPosition et GetNextAssoc pour itérer au sein de le tableau.
Utilisez l'opérateur de suppression pour supprimer la clé et/ou la valeur pour chaque élément de la table à mesure qu'il est produit dans l'itération.
Appelez la fonction d' RemoveAll pour supprimer tous les éléments de la carte après qu'ils ont été supprimés.
Le code pour supprimer tous les éléments d'une collection d' CMap est la suivante.Chaque élément dans le mappage a une chaîne comme clé et objet d' CPerson (dérivée d' 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 dans une carte ou RemoveKey pour supprimer un élément individuel à la clé spécifiée.