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;
8 Réponses :
Laissez-le sortir de la portée? P>
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é. P>
Vous ne passez pas ce pointeur sur 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 Supprimer code> 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. P>
partagé_ptr code> ou dans ce cas, partagé_array code> (vous pouvez trouver les deux à Boost et là-bas est une probabilité élevée que votre implémentation dispose déjà de std :: tr1 code>). p>
Ces pointeurs sont sur la pile; Vous n'avez pas à les supprimer. Ignorer simplement pointeur1 code> et ira à la fin du bloc. P>
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.
int** pointer1 = new int *; * pointer1 = new int [1000]; int* pointer2; pointer2 = * pointer1; delete pointer1;
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 * code> créé via nouveau code>. Étant donné que pointeur1 code> est alloué de manière dynamique dans ce cas, vous pouvez GRATUIT CODE> 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.
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. p>
Si vous voulez faire absolument sûr, rien d'autre ne peut utiliser Pointer1 plus longtemps, vous pouvez définir pointer1 = null code> une fois que vous avez terminé avec elle. P>
Lorsque vous déclarez statiquement un pointeur avec int * pointer1; code>, vous ne peux pas em> libérer. Vous ne pouvez que libérer de la mémoire allouée dynamiquement que vous avez allouée à l'aide de Nouveau code>, malloc code>, etc. Le seul moyen de "se débarrasser de" Pointer1 code> est Pour le laisser sortir de la portée, comme lorsque la fonction revient. Si vous avez terminé avec Pointer1 CODE> et que vous souhaitez l'empêcher d'être utilisée accidentellement pour modifier le tableau, utilisez pointeur1 = null; p>. P>.
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. P>
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. P> ou vous pouvez le laisser tomber hors de portée. p>
Est-ce que b = null; Supprimer B CODE> 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; code> est peu légal et inoffensif. Signifie que vous n'êtes pas obligé de toujours rechercher des non-ness avant de supprimer.