La suppression d'un pointeur en C++

Contexte: je suis en train d'envelopper ma tête autour de pointeurs, nous avons juste vu il y a quelques semaines à l'école et lors de la pratique aujourd'hui, j'ai couru dans une idiote? problème, il peut être super simple pour vous, mais j'ai peu ou aucune expérience de la programmation.

J'ai vu pas mal de questions de plus de, dans la à propos de la suppression des pointeurs, mais ils semblent tous liés à la suppression d'une classe, et non pas un "simple" pointeur (ou quel que soit le terme approprié peut être), voici le code que j'essaie de l'exécuter:

#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.

}

Donc mes questions sont:

  1. Pourquoi n'est-il pas le premier cas de travail? Qui me semble le plus simple pour utiliser et supprimer un pointeur? Le message d'erreur indique que la mémoire n'était pas affectés, mais 'cout' a renvoyé une adresse.
  2. Sur le deuxième exemple, l'erreur n'est pas déclenché, mais faire un cout de la valeur de myPointer encore retourne une adresse de mémoire?
  3. N' #3 fonctionnent vraiment? Semble fonctionner pour moi, le pointeur n'est plus à stocker une adresse, est-ce la bonne façon de supprimer un pointeur?

Désolé pour la longue question, a voulu faire de ce aussi clair que possible, de répéter, j'ai peu d'expérience en programmation, donc si quelqu'un pouvait répondre à cette aide de termes simples, il serait grandement apprécié!

  • La raison pour laquelle vous ne voyez pas le premier exemple est parce que c'est faux. Seulement delete ce que vous new. Il n'est pas obligatoire pour le pointeur pour définir lui-même à NULL après l'avoir supprimé. Si vous voulez sécurité, l'utilisation des pointeurs intelligents, qui libère la mémoire pour vous et vous donner des erreurs lorsque vous essayez d'accéder quand ils ne le font pas tenir quelque chose.
  • Hmm d'accord, je ne suis pas sûr de ce que les pointeurs intelligents sont, mais je vais regarder, merci!
  • En un mot, ils font ce que j'ai décrit. Afin de tenir quelque chose de nouveau, vous appelez reset et il libère l'ancien. Gratuit sans remplacement, vous appelez release. Quand elle est hors de portée, elle est détruite, et permettrait de libérer de la mémoire en fonction de quel type il est. std::unique_ptr est destiné qu'à un seul propriétaire. std::shared_ptr la libère lorsque le dernier propriétaire cesse de posséder les ressources. Ils sont également exception coffre-fort. Si vous allouer une ressource par un, puis la rencontre d'une exception, la ressource sera correctement libérée.
InformationsquelleAutor leopic | 2012-11-04