Destruktor C++: type '* * * ' - argument gegeben, um 'löschen', erwartet Zeiger
Als ich erklärte, dass eine private variable
vector<SomeClass> theVector;
irgendwo in meinem SomeClass-Klasse.
Warum kann ich nicht sagen: delete theVector
in meinem SomeClass Destruktor?
Die compiler-Fehlermeldung lautet:
type `class Vector<SomeClass>' argument given to `delete', expected pointer
Was erwartet Zeiger?
- "erwartet" pointer " bedeutet, dass der compiler erwartet einen Zeiger, wo etwas anderes angegeben wurde. Es ist nicht zu sagen, "erwartet" Zeiger gegeben wurde, zu löschen.
- Ich empfehle Ihnen, Lesen Sie gnomesane.net/code/doc/ptrarray, es wird erklärt, wie Zeiger und Referenzen funktionieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn new und delete gehen hand in hand.
Um etwas zu löschen, müssen Sie ihn erstellen über neue (gibt Sie einen Zeiger). Löschen Sie anschließend den Mauszeiger. Die Art und Weise erklären Sie die vector-es wird auf dem Stapel erzeugt (nicht auf dem heap) und wird freigegeben, wenn es den Bereich verlässt.
In C++ (im Gegensatz zu Java), können Sie Objekte erstellen, die entweder auf dem stack oder auf dem heap. Ein Beispiel für das erstellen Sie auf dem Stapel ist, wie Sie getan haben:
Diesem Objekt den Gültigkeitsbereich verlässt, wenn der stack-frame verschwindet (in der Regel, wenn Sie zurückkehren aus der Funktion, die das Objekt erstellt hat.
Erstellen von Objekten auf dem heap erlaubt Ihnen, überlebt die Funktion, die Sie erstellt haben, und Sie tun, indem Sie:
Dann können Sie passieren die
theVectorPtr
Zeiger wieder an den Aufrufer der Funktion (oder speichern Sie es Global, was auch immer Sie wollen).In, um loszuwerden, das Objekt auf dem heap explizit zu löschen es:
irgendwo im code.
Löschen eines Objekts auf dem heap, endet der Gültigkeitsbereich des Objekts, auf die gleiche Weise der Rückkehr aus einer Funktion endet der Gültigkeitsbereich von Variablen auf dem Stapel erzeugt.
vector<SomeClass*> theVectorPtr = new vector<SomeClass>();
Wirddelete theVectorPtr
Arbeit hier auch?new
gibt Sie einen Zeiger, und Sie versuchen, ordnen Sie einen Vektor anstatt einer Vektor-Zeiger. Das wird nicht mal kompilieren. Wenn Sie ihn wieder in einen Zeiger, es zu lösen, aber dann ist der Typ innerhalb der Vektor nicht mit. Versuchenstd::vector<SomeClass*> *v = new std::vector<SomeClass*>();
- und Sie werden auch in der Lage sein, um es zu löschen, aber möchten Sie vielleicht, um sicherzustellen, dass Sie das löschen der Zeiger innerhalb der Vektor-ersten.Wenn ein Objekt (nicht als Wert) ist definiert als eine Klasse member-variable ist, dann sind deren Speicher ist immer gebunden an das Objekt Instanz der Klasse.
Daher, wenn das enthaltende Objekt auf dem Stapel reserviert ist, wird das Objekt und der Bereich wird sterben, wenn der stack entrollt.
Wenn das enthaltende Objekt zugewiesen ist, auf den Haufen, und dann das field-Objekt wird sterben, wenn das gesamte enthaltene Objekt stirbt mit löschen.
Werden Sie nur die Anwendung zu löschen, um ein Feld, wenn, dass ist ein Zeiger, da alle, die gespeichert wird mit dem enthaltenden Objekt ist die Adresse einiger anderer Speicher, und löschen Sie die Materialien in diesem Bereich.
Den Speicher für theVector Teil der Speicher für die SomeClass Objekt, so können Sie nicht löschen, ohne löschen der gesamten SomeClass Objekt. Der Speicher für theVector erhalten automatisch freigegeben, wenn das SomeClass Objekt ist zerstört.
Zerstören alle Objekte, die statt in den Vektor möchten, führen Sie die folgenden:
Geschieht dies automatisch, wenn der Vektor geht out of scope.
Dies ist, weil theVector ist kein Zeiger, das ist, was
delete' expects. "Expected pointer" means the operand of
löschen' muss ein Zeiger.Vergleichen
Es wird sicher einen Fehler erzeugen, ähnlich dem, was Sie bekam.
c++ gibt Ihnen die Flexibilität zum erstellen von Objekt im stack und heap.
Beim erstellen der Objekte im heap durch den new-operator, wie unten gezeigt, es gibt den Zeiger auf das Objekt im heap.
Für das Objekt erstellt, in der stack-Konstruktor gibt das Objekt zurück, anstatt Zeiger wie unten gezeigt.
- und stack-Objekt automatisch zerstört, wenn die variable(obj_class) geht out of scope,aber Objekt erstellt heap Leben für immer.So zerstören heap-Objekt-c++ haben Sie die delete-operator nimmt pointer als argument und zerstört das Objekt, das der Zeiger verweist.