Contexte: J'essaie de comprendre les pointeurs, nous les avons vus il y a quelques semaines à l'école et en pratiquant aujourd'hui, je suis tombé sur un idiot? problème, cela peut être très simple pour vous, mais j'ai peu ou pas d'expérience en programmation.
J'ai vu pas mal de questions dans SO sur la suppression de pointeurs, mais elles semblent toutes liées à la suppression d'une classe et non d'un pointeur `` simple '' (ou quel que soit le terme approprié), voici le code que j'essaie de courir:
#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:
- Pourquoi le premier cas ne fonctionnera-t-il pas? Semble l'utilisation la plus simple pour utiliser et supprimer un pointeur? L'erreur indique que la mémoire n'a pas été allouée mais «cout» a renvoyé une adresse.
- Sur le deuxième exemple, l'erreur n'est pas déclenchée mais faire un cout de la valeur de myPointer renvoie toujours une adresse mémoire?
- Le n ° 3 fonctionne-t-il vraiment? Cela me semble fonctionner, le pointeur ne stocke plus d'adresse, est-ce la bonne façon de supprimer un pointeur?
Désolé pour la longue question, je voulais que cela soit aussi clair que possible, aussi pour le répéter, j'ai peu d'expérience en programmation, donc si quelqu'un pouvait répondre à cette question en utilisant des termes simples, ce serait grandement apprécié!
delete
ce que vousnew
. Il n'est pas non plus nécessaire que le pointeur se définisse sur NULL après l'avoir supprimé. Si vous voulez la sécurité là-bas, utilisez des pointeurs intelligents, qui libèrent la mémoire pour vous et donnent des erreurs lorsque vous essayez d'y accéder alors qu'ils ne contiennent pas quelque chose.