Destruktor C ++: Geben Sie das "***" -Argument ein, das für "delete" (erwarteter Zeiger) angegeben wurde

7

Ich habe eine private Variable deklariert

%Vor%

irgendwo in meiner SomeClass-Klasse.

Warum kann ich nicht sagen: delete theVector in meinem SomeClass-Destruktor?

Der Compilerfehler sagt:

%Vor%

Was erwartete Zeiger?

    
andandandand 20.12.2008, 02:58
quelle

7 Antworten

14

Wenn Neu und Löschen Hand in Hand gehen.

Um etwas zu löschen, müssen Sie es über new erstellen (was Ihnen einen Zeiger gibt). Sie können dann den Zeiger löschen. Die Art und Weise, wie Sie den Vektor deklarieren, auf dem er erstellt wird (nicht der Heap) und wird aufgehoben, wenn er den Gültigkeitsbereich verlässt.

%Vor%     
Martin York 20.12.2008, 03:01
quelle
7

In C ++ (im Gegensatz zu Java) können Sie Objekte entweder auf dem Stapel oder auf dem Heap erstellen. Ein Beispiel für das Erstellen auf dem Stapel ist, wie Sie es getan haben:

%Vor%

Dieses Objekt wird nicht mehr angezeigt, wenn der Stapelrahmen verschwindet (normalerweise, wenn Sie von der Funktion zurückkehren, die das Objekt erstellt hat.

Das Erstellen von Objekten auf dem Heap ermöglicht es ihnen, die Funktion, mit der sie erstellt wurden, zu überleben, indem Sie Folgendes ausführen:

%Vor%

Sie können dann den Zeiger theVectorPtr an den Aufrufer der Funktion zurückgeben (oder global speichern, was immer Sie wollen).

Um das Objekt auf dem Heap loszuwerden, löschen Sie es explizit:

%Vor%

irgendwo in Ihrem Code.

Das Löschen eines Objekts auf dem Heap beendet den Bereich dieses Objekts. Auf dieselbe Art und Weise wird der Bereich der Variablen, die auf dem Stapel erstellt wurden, von einer Funktion zurückgegeben.

    
paxdiablo 20.12.2008 03:40
quelle
3

Wenn ein Objekt (und nicht ein Wert) als Klassenmitgliedsvariable definiert ist, ist sein Speicher immer an die Objektinstanz dieser Klasse gebunden.

Wenn das umhüllende Objekt auf dem Stapel zugeordnet ist, werden daher dieses Objekt und das Feld beim Abrollen des Stapels gelöscht.

Wenn das umhüllende Objekt auf dem Heap zugeordnet ist, stirbt das Feldobjekt, wenn das gesamte enthaltene Objekt mit delete endet.

Sie werden nur löschen auf ein Feld anwenden, wenn das ein Zeiger ist, da alles, was mit dem enthaltenden Objekt gespeichert wird, die Adresse eines anderen Speicherbereichs ist, und Sie löschen die Materialien in diesem Bereich.

    
Uri 20.12.2008 03:01
quelle
2

Der Speicher für theVector ist Teil des Speichers, der für das SomeClass-Objekt reserviert ist. Daher können Sie ihn nicht löschen, ohne das gesamte SomeClass-Objekt zu löschen. Der Speicher für den Vektor wird automatisch freigegeben, wenn das SomeClass-Objekt zerstört wird.

    
David Norman 20.12.2008 03:02
quelle
2

Um alle im Vektor enthaltenen Objekte zu zerstören, würden Sie Folgendes tun:

%Vor%

Dies geschieht automatisch, wenn der Vektor den Gültigkeitsbereich verlässt.

    
nobar 12.01.2009 02:10
quelle
1

Das liegt daran, dass der Vektor kein Zeiger ist, was delete' expects. "Expected pointer" means the operand of delete 'ein Zeiger sein muss.

Vergleichen Sie dies mit

%Vor%

Es wird sicherlich einen Fehler ähnlich dem, was Sie bekommen haben, erzeugen.

    
PolyThinker 20.12.2008 03:00
quelle
1

c ++ gibt Ihnen die Flexibilität, ein Objekt in Stack und Heap zu erstellen. Wenn das Objekt im Heap über den neuen Operator erstellt wird, wie unten gezeigt, wird der Zeiger auf das Objekt im Heap zurückgegeben.

%Vor%

Für Objekte, die im Stapel erstellt wurden, gibt der Konstruktor das Objekt und nicht den Zeiger zurück, wie unten gezeigt.

%Vor%

und Stapelobjekt wird automatisch zerstört, wenn die Variable (obj_class) den Gültigkeitsbereich verlässt, aber das auf dem Heap erstellte Objekt lebt für immer. So zerstören Sie das Heap-Objekt c ++ gibt Ihnen den Löschoperator, der den Zeiger als Argument verwendet und das Objekt zerstört, auf das der Zeiger zeigt zu.

    
yesraaj 20.12.2008 06:08
quelle

Tags und Links