Löschen eines Zeigers in C ++
Kontext: ich versuche, wickeln Sie meinen Kopf herum, Zeiger, wir sahen Sie vor ein paar Wochen in der Schule und beim üben heute lief ich in eine dumme? Frage, kann es super einfach für Sie, aber ich habe wenig bis keine Programmiererfahrung.
Ich habe gesehen, durchaus ein paar Fragen mehr in SO über das löschen von Zeigern, aber Sie alle scheinen mit dem löschen einer Klasse und nicht eine "einfache" Zeiger (oder was auch immer der richtige Begriff sein mag), hier ist der code, den ich versuche zu laufen:
#include <iostream>;
using namespace std;
int main() {
int myVar,
*myPointer;
myVar = 8;
myPointer = &myVar;
cout << "delete-ing pointers " << endl;
cout << "Memory address: " << myPointer << endl;
//Seems I can't *just* delete it, as it triggers an error
delete myPointer;
cout << "myPointer: " << myPointer << endl;
//Error: a.out(14399) malloc: *** error for object 0x7fff61e537f4:
//pointer being freed was not allocated
//*** set a breakpoint in malloc_error_break to debug
//Abort trap: 6
//Using the new keyword befor deleting it works, but
//does it really frees up the space?
myPointer = new int;
delete myPointer;
cout << "myPointer: " << myPointer << endl;
//myPointer continues to store a memory address.
//Using NULL before deleting it, seems to work.
myPointer = NULL;
delete myPointer;
cout << "myPointer: " << myPointer << endl;
//myPointer returns 0.
}
Also meine Fragen sind:
- Warum nicht der erste Fall arbeiten? Scheint die einfache Anwendung zu verwenden und zu löschen ein Zeiger? Die Fehlermeldung sagt das der Speicher nicht reserviert, aber 'cout' zurückgegebene Adresse.
- Auf das zweite Beispiel wird der Fehler nicht ausgelöst wird, aber dabei eine cout der Wert von myPointer noch gibt eine Speicher-Adresse?
- Tut #3 wirklich funktionieren? Scheint zu funktionieren für mich, der Zeiger ist nicht mehr die Speicherung einer Adresse, ist das die richtige Art und Weise zu löschen ein Zeiger?
Sorry für die lange Frage, wollte dies so klar wie möglich, auch zu bekräftigen, habe ich wenig Programmiererfahrung, so dass, wenn jemand beantworten könnte, dies mit einfachen Worten gesagt, es würde sehr geschätzt werden!
InformationsquelleAutor der Frage leopic | 2012-11-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
1 & 2
Die erste variable auf dem Stapel reserviert. Sie nennen können, löschen Sie nur Speicher, den Sie reserviert dynamisch (auf dem heap) mit der
new
Betreiber.3.
Oben hat gar nichts. Sie hat nicht alles kostenlos, wie der Zeiger zeigte auf NULL.
Die folgenden nicht getan werden sollte:
Du wies er bei NULL, so dass hinter Speicherbelegung (new int Sie zugeordnet sind).
Sie sollten den Speicher frei, waren Sie gerichtet. Gibt es keine Möglichkeit, dass der Zugang zugewiesen
new int
mehr, daher Speicherverlust.Der richtige Weg:
Der bessere Weg:
Wenn Sie mit C++, nicht raw-Pointer. Verwenden intelligente Zeiger statt, die diese Dinge für Sie, mit wenig Aufwand. C++11 kommt mit mehrere.
InformationsquelleAutor der Antwort Anirudh Ramanathan
Ich glaube du hast nicht ganz verstanden, wie Zeiger arbeiten.
Wenn Sie einen Zeiger auf Speicher es gibt drei verschiedene Dinge, die Sie verstehen müssen:
- es ist "was ist spitz", indem Sie den Mauszeiger (der Speicher)
- diese Speicher-Adresse
- nicht alle Zeiger haben müssen, Ihr Gedächtnis gelöscht: nur löschen müssen, um Speicher, der dynamisch zugewiesen werden (verwendet
new
Betreiber).Vorstellen:
Wenn du hast
C++ erlaubt es, dass Sie versuchen zu
delete
einen Zeiger, Punkte zunull
aber es hat nicht wirklich etwas zu tun, gibt keine Fehler.InformationsquelleAutor der Antwort salgadokk
Zeiger sind ähnlich wie bei normalen Variablen, dass Sie nicht brauchen, um Sie zu löschen. Sie werden aus dem Speicher entfernt, am Ende einer Funktionen die Ausführung und/oder das Ende des Programms.
Allerdings kann man Zeiger verwenden sollen einen 'block' von Speicher, wie zum Beispiel diese:
So weisen Sie Speicherplatz für 20000 zahlen. Nützlich, weil der Stack hat eine begrenzte Größe, und möchten Sie vielleicht, um Chaos über mit einer großen Ladung 'ints' ohne einen stack-überlauf-Fehler.
Jedem Aufruf neu, Sie sollten dann 'löschen', am Ende von Ihrem Programm, weil Sie sonst erhalten Sie ein Speicher-Leck, und einige zugewiesenen Speicherplatz wird nie wieder für andere Programme verwenden. Um dies zu tun:
Hoffe, das hilft.
InformationsquelleAutor der Antwort user3728501
neue wird nie aufgerufen. Also die Adresse, die cout-prints ist die Adresse des Speicherplatzes von myVar, oder der Wert zugewiesen myPointer in diesem Fall. Schriftlich:
Ihnen sagen:
Gibt es eine Adresse, die Punkte auf einem Speicherplatz, der gelöscht wurde. Weil zuerst legen Sie den Zeiger und vergeben Sie seinen Wert auf myPointer, zweiten Sie ihn löschen, können Dritte Sie es drucken. Also, es sei denn Sie weisen einen anderen Wert, um myPointer, die gelöschte Adresse wird bleiben.
NULL gleich 0, Sie löschen auf 0, so dass Sie nichts löschen. Und es ist die Logik, dass es druckt 0, weil du es getan hast:
entspricht:
InformationsquelleAutor der Antwort fonZ
InformationsquelleAutor der Antwort Hakan Serce
InformationsquelleAutor der Antwort Casper Beyer