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:

  1. 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.
  2. Auf das zweite Beispiel wird der Fehler nicht ausgelöst wird, aber dabei eine cout der Wert von myPointer noch gibt eine Speicher-Adresse?
  3. 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

Schreibe einen Kommentar