8
votes

Comment supprimez-vous un pointeur sans supprimer les données que le pointeur pointe-t-il?

J'ai un pointeur qui pointe sur un tableau et un autre pointeur faisant référence au même tableau. Comment puis-je supprimer l'un de ces pointeurs sans tuer le tableau de telle sorte que le deuxième pointeur indéfinissé fonctionne toujours?

Par exemple: P>

int* pointer1 = new int [1000];
int* pointer2;
pointer2 = pointer1;


0 commentaires

8 Réponses :


10
votes

Laissez-le sortir de la portée?

Vous ne "supprimez pas" les pointeurs, vous supprimez ce qu'ils pointent. Donc, si vous voulez simplement vous débarrasser de la variable 'Pointer1', le seul moyen de le faire est que cela a été créé pour être résilié.


0 commentaires

10
votes

Vous ne passez pas ce pointeur sur Supprimer du tout. Vous arrêtez simplement d'utiliser ce pointeur. Si vous souhaitez vous assurer de ne pas accéder à la matrice à nouveau sur ce pointeur, vous pouvez la définir sur NULL.

C et C ++ Ne gardez pas une trace du nombre de pointeurs pointant vers un objet ou un tableau. Si vous souhaitez compter de référence, vous devez utiliser un conteneur compté de référence, comme partagé_ptr ou dans ce cas, partagé_array (vous pouvez trouver les deux à Boost et là-bas est une probabilité élevée que votre implémentation dispose déjà de dans l'espace de noms std ou dans std :: tr1 ).


0 commentaires

13
votes

Ces pointeurs sont sur la pile; Vous n'avez pas à les supprimer. Ignorer simplement pointeur1 et ira à la fin du bloc.


4 commentaires

Ahh cela explique-t-il le meilleur pour moi. Donc, un pointeur est simplement une variable sur la pile, cela a du sens. Cela signifie donc que cela ne peut pas être accessible hors de portée et je ne l'utiliserai pas accidentellement ailleurs hors de portée et causer des problèmes. D'accord, merci.


@ Faken- Pour être clair, "un pointeur est simplement une variable sur la pile" n'est pas une déclaration vraie. Le pointeur de votre échantillon de code est une variable de pile car vous l'avez déclarée statiquement. Un pointeur peut également être déclaré de manière dynamique, comme le montre Neil Butterworth dans son exemple. Tout est dans la façon dont vous le déclarez, il n'y a rien de spécial sur l'objet étant un pointeur.


@BTA: Je ne vois rien de statiquement déclaré. Peut-être que vous voulez dire "automatique", le terme réel. (C'est-à-dire que les choses ne sont pas pile allouées, mais elles sont automatiquement allouées.)


Le compilateur est autorisé à "rendre le pointeur disparaître" dès que le compilateur ne le juge pas utilisé. Un pointeur peut disparaître avant la fin du bloc.



1
votes
int** pointer1 = new int *;
* pointer1 = new int [1000];
int* pointer2;
pointer2 = * pointer1;
delete pointer1;

4 commentaires

Heh, tu m'as été très serviable dans le passé, mais cette fois, vous venez de me confondre à la place, heh.


@Faken Considérez-le une leçon Zen :-) Fondamentalement, comme d'autres l'ont souligné, votre question comme demandé n'a pas trop de sens.


@ Faken - Il vous montre ce que vous devriez faire si vous vouliez pouvoir supprimer le pointeur. Il crée un "pointeur à un pointeur" et l'attribue l'adresse d'un int * créé via nouveau . Étant donné que pointeur1 est alloué de manière dynamique dans ce cas, vous pouvez GRATUIT une fois que vous avez terminé avec elle. La complexité de cette solution indique probablement que vous devez repenser si vous avez vraiment besoin de supprimer le pointeur.


@Neil: l'ignorance est bonheur. C'est ce qui m'arrive quand je suis jeté de la profondeur. Ne présentant aucune expérience de programmation ou une formation réelle avant de sauter dans un projet de programmation massif a tendance à avoir cet effet. Remarquez comment toute ma réputation est gagnée de votes pure à mes questions ... Heh ... Inutile de dire que Stackoverflow a sauvé ma vie.



3
votes

C'est une variable de pile (la façon dont vous avez écrites) et donc lié à la portée que vous avez déclarée dans. Une fois que vous avez frappé la corde bouclée de cette portée particulière, elle sera nettoyée sans que vous ne suiviez rien à ce sujet.

Si vous voulez faire absolument sûr, rien d'autre ne peut utiliser Pointer1 plus longtemps, vous pouvez définir pointer1 = null une fois que vous avez terminé avec elle.


0 commentaires

4
votes

Lorsque vous déclarez statiquement un pointeur avec int * pointer1; , vous ne peux pas libérer. Vous ne pouvez que libérer de la mémoire allouée dynamiquement que vous avez allouée à l'aide de Nouveau , malloc , etc. Le seul moyen de "se débarrasser de" Pointer1 est Pour le laisser sortir de la portée, comme lorsque la fonction revient. Si vous avez terminé avec Pointer1 et que vous souhaitez l'empêcher d'être utilisée accidentellement pour modifier le tableau, utilisez pointeur1 = null; . .


0 commentaires

1
votes

Ignorez simplement le pointeur et cela disparaîtra lorsque vous avez terminé avec votre fonction ou votre bloc. Rappelez-vous simplement qu'une fois que vous n'avez plus de pointeur à quelque chose, cela ne pourra pas être consulté. Bien sûr, il sera toujours là en utilisant la mémoire en haut, mais vous ne pourrez pas y arriver. Ainsi, avant d'envisager de laisser aller du pointeur, assurez-vous que vous ayez un autre pointeur quelque part ou vous en débarrassez.


0 commentaires

4
votes

Normalement pour faire un pointeur "sûr", il suffit de le mettre à NULL, ce qui ne fait que rien du tout. Ou vous pouvez simplement le laisser sortir de la portée.

Par exemple, si vous avez deux pointeurs. xxx

ou vous pouvez le laisser tomber hors de portée. xxx


2 commentaires

Est-ce que b = null; Supprimer B Faites quelque chose? Est-ce défini? J'avais l'impression que c'est une sorte de bug ou de comportement non défini.


@Nathan: foo = null; Supprimer FOO; est peu légal et inoffensif. Signifie que vous n'êtes pas obligé de toujours rechercher des non-ness avant de supprimer.