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:
- 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.
- 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?
- 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 vousnew
. 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 appelezrelease
. 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.
Vous devez vous connecter pour publier un commentaire.
1 & 2
La première variable a été alloué sur la pile. Vous pouvez appeler supprimer uniquement sur la mémoire allouée dynamiquement (sur le tas) à l'aide de la
new
opérateur.3.
Le ci-dessus ne rien du tout. Vous n'avez pas libre quoi que ce soit, tant que le pointeur a souligné la valeur NULL.
La suite ne devrait pas être fait:
Vous le fait à NULL, laissant derrière lui une fuite de mémoire (new int vous avez alloué).
Vous devez libérer de la mémoire, vous avez été pointant du doigt. Il n'y a aucun moyen d'accéder à ce qui est prévu
new int
plus, d'où fuite de mémoire.La façon correcte:
La meilleure façon:
Si vous êtes à l'aide de C++, ne pas utiliser des pointeurs. Utilisation pointeurs intelligents à la place qui peut s'occuper de ces choses pour vous à peu de frais généraux. C++11 est livré avec plusieurs.
delete myPointer
libère*myPointer
, etmyPointer
n'est plus au pointage de quoi que ce soit. Il sera détruit à la fin de la portée.delete myPointer
libère*myPointer
. Qui est correct. MaismyPointer
continue de pointer vers un emplacement de la mémoire qui a été libéré et ne devrait pas être utilisé, car il est UB. Il sera inaccessible après la fin de la portée que SI c'était une variable locale dans la première place.new
tous les jours. (Je suis de fromage!)NULL
nous empêche de les utiliser plus tard.Je crois que vous n'êtes pas entièrement comprendre comment les pointeurs de travail.
Lorsque vous avez un pointeur pointant vers la mémoire il y a trois choses différentes que vous devez comprendre:
- il n'y a "ce qui est fait" par le pointeur (la mémoire)
- cette adresse mémoire
- pas tous les pointeurs ont besoin d'avoir leur mémoire supprimée: vous avez seulement besoin de supprimer de la mémoire qui a été allouée dynamiquement (utilisé
new
opérateur).Imaginer:
Lorsque vous n'avez
C++ permet que vous essayez de
delete
un pointeur qui pointe versnull
mais il ne fait pas faire quoi que ce soit, ne donne pas d'erreur.Les pointeurs sont similaire à la normale des variables que vous n'avez pas besoin de les supprimer. Ils sont supprimées de la mémoire à la fin d'une des fonctions d'exécution et/ou la fin du programme.
Vous pouvez toutefois utiliser des pointeurs pour allouer un "bloc" de la mémoire, par exemple comme ceci:
Cela permettra d'allouer de l'espace mémoire pour 20000 entiers. Utile, parce que la Pile a une taille limitée, et vous pourriez perdre sur avec une grosse charge de "services de renseignements", sans une erreur de dépassement de pile.
Chaque fois que vous appelez nouveau, vous devez ensuite "supprimer" à la fin de votre programme, car sinon vous obtiendrez une fuite de mémoire, et certains alloué la mémoire, l'espace ne sera jamais renvoyé pour d'autres programmes. Pour ce faire:
Espère que ça aide.
nouvelle n'est jamais appelée. Si l'adresse que le cout des tirages est l'adresse de l'emplacement mémoire de myVar, ou la valeur attribuée à myPointer dans ce cas. Par écrit:
vous dire:
Il retourne une adresse qui pointe vers un emplacement de la mémoire qui a été supprimé. Parce que d'abord vous créer le pointeur et affecter sa valeur à myPointer, deuxième de la supprimer, troisième de l'imprimer. Donc, sauf si vous affectez une valeur à myPointer, l'supprimé maintien de l'adresse.
NULL est égal à 0, vous supprimez 0, de sorte que vous ne rien supprimer. Et il est logique qu'il affiche " 0 " parce que vous avez fait:
égal à: