Löschen aller Objekte in einer CObject-Sammlung
Dieser Artikel wird beschrieben, wie Sie die Objekte in einer Auflistung gelöscht (ohne das Auflistungsobjekt selbst zu deaktivieren).
Um alle Objekte in einer Sammlung von CObjects (oder Objekten zu löschen abgeleitet von CObject), verwenden Sie eine der Iterationstechniken, die im Artikel Zugreifen auf alle Member einer Auflistung beschrieben werden um jedes Objekt einzeln zu löschen.
Warnung
Objekte in Auflistungen können freigegeben werden.Das heißt, enthält die Auflistung ein Zeiger auf das Objekt, aber andere Teile des Programms haben möglicherweise auch Zeiger zum gleichen Objekt.Begrenzen Sie, dass kein Objekt löschen, das freigegeben wird, bis alle Bestandteile mithilfe des Objekts haben.
In diesem Artikel wird gezeigt, wie Sie Objekte in löscht:
Eine Liste
Ein Array
Eine Zuordnung
Um alle Objekte in einer Liste von zu Zeigern CObject löschen
Verwendung von GetHeadPosition und GetNext, durch die Liste durchlaufen.
Verwenden Sie den Operator löschen, um jedes Objekt zu löschen, wie es in der Iteration gefunden wird.
Rufen Sie die Funktion RemoveAll auf, um alle Elemente aus der Liste entfernen, nachdem die Objekte, die mit den Elementen zugeordnet sind, gelöscht wurden.
Das folgende Beispiel zeigt, wie Sie die Objekte aus einer Liste von CPerson-Objekten gelöscht. Jedes Objekt in der Liste ist ein Zeiger auf ein CPerson-Objekt, das ursprünglich auf dem Heap reserviert wurde.
CTypedPtrList<CObList, CPerson*> myList;
CPerson* pPerson = new CPerson();
myList.AddHead(pPerson);
POSITION pos = myList.GetHeadPosition();
while(pos != NULL)
{
delete myList.GetNext(pos);
}
myList.RemoveAll();
Der letzte Funktionsaufruf, RemoveAll, ist eine Listenmemberfunktion, die alle Elemente aus der Liste entfernt. Die Memberfunktion RemoveAt wird ein einzelnes Element.
Beachten Sie den Unterschied zwischen dem Löschen des Objekts eines Elements und das Entfernen des Elements selbst. Ein Element aus der Liste entfernen, entfernt nur den Verweis der Liste auf das Objekt. Das Objekt ist noch im Arbeitsspeicher. Wenn Sie ein Objekt löschen, wird es auf vorhanden und der Arbeitsspeicher wird freigegeben. Daher ist es wichtig, ein Element zu entfernen, nachdem das Objekt des Elements gelöscht wurde, damit die Liste nicht versucht, auf Objekte zugreifen, die nicht mehr vorhanden sind.
Um alle Elemente in einem Array löschen
Verwenden Sie GetSize und Ganzzahlenindexwerte, um das Array zu durchlaufen.
Verwenden Sie den Operator löschen, um die jeweiligen Elemente zu löschen, wie es in der Iteration gefunden wird.
Rufen Sie die Funktion RemoveAll auf, um alle Elemente aus dem Array entfernen, nachdem sie gelöscht wurden.
Der Code zum Löschen aller Elemente eines Arrays ist, wie folgt:
CArray<CPerson*, CPerson*> myArray; int i = 0; while (i < myArray.GetSize()) { delete myArray.GetAt(i++); } myArray.RemoveAll();
Wie im Listenbeispiel oben, können Sie RemoveAll aufrufen, um alle Elemente in einem Array oder in RemoveAt zu entfernen, wenn ein einzelnes Element zu entfernen.
Um alle Elemente in einer Zuordnung löschen
Verwenden Sie GetStartPosition und GetNextAssoc, um das Array zu durchlaufen.
Verwenden Sie den Operator löschen, um den Schlüssel und/oder den Wert für jedes Kartenelement zu löschen, wie es in der Iteration gefunden wird.
Rufen Sie die Funktion RemoveAll auf, um alle Elemente aus der Zuordnung zu entfernen, nachdem sie gelöscht wurden.
Der Code zum Löschen aller Elemente einer Auflistung CMap lautet wie folgt. Jedes Element in der Zuordnung hat eine Zeichenfolge als Schlüssel und CPerson-Objekt (abgeleitet von CObject) als Wert.
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();
Sie können RemoveAll aufrufen, um alle Elemente in einer Zuordnung oder RemoveKey zu entfernen, wenn ein einzelnes Element mit dem angegebenen Schlüssel zu entfernen.