Löschen aller Objekte in einer CObject-Auflistung
In diesem Artikel wird beschrieben, wie Sie alle Objekte in einer Auflistung gelöscht wird (ohne das Auflistungsobjekt selbst löschen).
Um alle Objekte in einer Auflistung von CObject s (oder Löschen von Objekten abgeleitet von CObject), verwenden Sie eine der Iterationen techniken, die im Artikel Alle Member einer Auflistung zugreifen beschriebenen um jedes Objekt wiederum zu löschen.
Vorsicht |
---|
Objekte in den Auflistungen können freigegeben werden.Das heißt, enthält die Auflistung einen Zeiger auf das Objekt, aber andere Teile des Programms haben möglicherweise auch Zeiger auf das gleiche Objekt.Sie müssen sorgfältig darauf achten, dass kein Objekt löschen, das freigegeben werden soll, bis alle Teile anhand des Objekts abgeschlossen wurde. |
In diesem Artikel wird erläutert, wie Sie die Objekte löschen:
Eine Liste
Ein Array
Eine Zuordnung
So zeigen Sie alle Objekte in einer Liste von Zeigern auf CObject löschen
Verwendung GetHeadPosition und GetNext, durch die Liste durchlaufen.
Verwenden Sie den Operator delete, um jedes Objekt zu löschen, wie es in der Iteration erreicht wird.
Rufen Sie die RemoveAll-Funktion auf, um alle Elemente aus der Liste zu entfernen, nachdem die Objekte, die mit diesen Elementen zugeordnet sind, gelöscht wurden.
Das folgende Beispiel zeigt, wie Sie alle Objekte aus einer Liste von CPerson-Objekte gelöscht werden sollen.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 Memberfunktion einer Liste, die alle Elemente aus der Liste entfernt.Die Memberfunktion RemoveAt entfernt ein einzelnes Element.
Beachten Sie den Unterschied zwischen dem Löschen des Objekts eines Elements und dem 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 sind, und sein Speicher freigegeben wird.Daher ist es wichtig, ein Element zu entfernen, unmittelbar nachdem das Objekt das Element gelöscht wurde, sodass die Liste nicht versucht, den Zugriff auf Objekte, die nicht mehr vorhanden sind.
Um alle Elemente in einem Array löschen
Verwenden Sie GetSize und ganzzahlige Index, um das Array zu durchlaufen.
Verwenden Sie den Operator delete der einzelnen Elemente gelöscht werden sollen, wie sie in der Iteration erreicht wird.
Rufen Sie die RemoveAll-Funktion auf, um alle Elemente aus dem Array zu entfernen, nachdem sie gelöscht wurden.
Der Code für das 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 obigen Beispiel mit Listen können Sie RemoveAll aufrufen, um alle Elemente in einem Array oder RemoveAt zu entfernen, 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 delete den Schlüssel bzw. den Wert für jedes Kartenelement zu löschen, wie es in der Iteration erreicht wird.
Rufen Sie die RemoveAll-Funktion auf, um alle Elemente aus der Zuordnung zu entfernen, nachdem sie gelöscht wurden.
Der Code für das Löschen aller Elemente einer Auflistung CMap lautet wie folgt.Jedes Element in der Zuordnung verfügt über 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, ein einzelnes Element mit dem angegebenen Schlüssel entfernt werden soll.