Kontext: Ich versuche, meinen Kopf um Zeiger zu wickeln. Wir haben sie erst vor ein paar Wochen in der Schule gesehen und als ich heute übte, bin ich auf einen Dummkopf gestoßen. Problem, es kann für Sie sehr einfach sein, aber ich habe wenig bis gar keine Programmiererfahrung.
Ich habe in SO einige Fragen zum Löschen von Zeigern gesehen, aber alle scheinen mit dem Löschen einer Klasse und nicht mit einem 'einfachen' Zeiger (oder was auch immer der richtige Begriff sein mag) zusammenhängen. Hier ist der Code, den ich versuche Lauf:
#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.
}
Meine Fragen sind also:
- Warum funktioniert der erste Fall nicht? Scheint die einfachste Verwendung zu sein, um einen Zeiger zu verwenden und zu löschen? Der Fehler besagt, dass der Speicher nicht zugewiesen wurde, aber 'cout' eine Adresse zurückgegeben hat.
- Auf dem zweiten Beispiel wird der Fehler nicht ausgelöst wird , sondern ein cout des Wertes MyPointer tut noch eine Speicheradresse zurückgegeben.
- Funktioniert # 3 wirklich? Scheint mir zu funktionieren, der Zeiger speichert keine Adresse mehr. Ist dies der richtige Weg, um einen Zeiger zu löschen?
Entschuldigung für die lange Frage, wollte dies so klar wie möglich machen, auch um es noch einmal zu wiederholen, ich habe wenig Programmiererfahrung, also wenn jemand dies mit Laienbegriffen beantworten könnte, wäre es sehr dankbar!
reset
und es befreit das Alte. Um es ersatzlos freizugeben, rufen Sie an release
. Wenn es den Gültigkeitsbereich verlässt, wird es zerstört und kann den Speicher basierend auf dem Typ freigeben. std::unique_ptr
ist nur für einen Besitzer gedacht. std::shared_ptr
gibt es frei, wenn der letzte Besitzer die Ressource nicht mehr besitzt. Sie sind auch ausnahmesicher. Wenn Sie einer Ressource eine zuweisen und dann auf eine Ausnahme stoßen, wird die Ressource ordnungsgemäß freigegeben.
delete
was dunew
. Es ist auch nicht erforderlich, dass sich der Zeiger nach dem Löschen auf NULL setzt. Wenn Sie dort Sicherheit wünschen, verwenden Sie intelligente Zeiger, die den Speicher für Sie freigeben und Fehler verursachen, wenn Sie versuchen, auf sie zuzugreifen, wenn sie nichts enthalten.