Je suis tombé sur ce sur le filet pendant que j'étudiais des trucs liés à des fuites de mémoire.
int* Function() { int arrays[10]; /* Some code here */ return &(arrays[0]); }
3 Réponses :
Je ne sais pas si ce sont des explications officielles, mais j'espère que cela donne une meilleure signification pour cet exemple: P>
Référence suspendue: L'instruction de retour renvoie une référence (pointeur) sur les tableaux. Cependant, la mémoire est (ou peut être) retirée après la fermeture de la fonction, il existe donc une référabilité de la mémoire allouée, qui est appelée référence suspendue. p>
Cela peut entraîner une faute de protection générale. En général, la mémoire qui n'est pas attribuée ne doit pas être écrite. Si vous essayez de faire cela, un défaut de protection générale peut être soulevé par le système d'exploitation. P>
Ceci a 2 conséquences: p>
Le résultat est un comportement indéfini et peut également dépendre de votre compilateur et de compiler des options. P> Les tableaux code> sont alloués sur la pile lorsque
fonction code> est appelé.
fonction code> renvoie une adresse d'une structure allouée sur la pile. Lorsque
fonction code> renvoie le pointeur de pile est renvoyé, mais ses données sont toujours sur la pile.
Lorsque la région de la pile précédemment libérée sera utilisée par une autre fonction ou une autre fonction, cette fonction écrira ses données de portée locales dans une partie de pile qui est toujours potentiellement accessible à partir du pointeur précédemment renvoyé. P>
Cela ne fait pas exactement la mémoire de la mémoire, car le tableau attribué sera automatiquement distribué lorsque la fonction retourne. C'est ce que l'on entend par une référence suspendue, vous retournez un pointeur sur une mémoire allouée sur la pile. Lorsque la fonction renvoie, la matrice allouée de la pile est traitée, de sorte que l'emplacement en mémoire puisse être écrasé par des données pour l'appel de fonction suivant, de sorte que la déséroférience du pointeur retourné donnera une valeur non définie. Cela pourrait bien causer une défaillance de protection générale, car la valeur du pointeur pourrait changer de telle sorte que cela pointe en dehors de l'espace d'adressage valide, Dereffing Un tel pointeur entraînerait une défaillance de protection générale. P>
L'auteur ne sait pas très bien que c'était très bien, ou vous vous déformez de la représenter. Le programme a un comportement indéfini.
Cela ne fuit pas exactement la mémoire, car le tableau attribué sera automatiquement traité lorsque la fonction retourne. C'est ce que l'on entend par une référence suspendue, vous retournez un pointeur sur une mémoire allouée sur la pile. Lorsque la fonction renvoie, la matrice allouée de la pile est traitée, de sorte que l'emplacement en mémoire puisse être écrasé par des données pour l'appel de fonction suivant, de sorte que la déséroférience du pointeur retourné donnera une valeur non définie.
YUP ressemble à la suspension de référence signifie faire référence à quelque chose sur la pile qui n'existe plus.
Pour développer ce que @kerreksb parle de (son commentaire est le bon), lisez La section de cette page Cela dit "Aucun voyage" . C est une langue pour décrire le calcul abrégé; C'est pas i> un raccourci pour les instructions de montage. Il n'y a pas de comportement que c exige ce code - il peut faire n'importe quoi.
Juste pour ajouter à ce qui est déjà écrit par d'autres: la fonction est parfaitement valide - il retournera un pointeur sur le tableau qui a été attribué à l'intérieur de la fonction et n'est plus affecté. Quelle utilité est-elle d'obtenir un pointeur à un emplacement qui n'est plus attribué - cela est arguable ... mais devriez-vous écrire quelque chose dans un emplacement non attribué - normalement - non, vous ne devriez pas écrire .. mais si vous voulez écrire un cool Virus ou ver ou construire une charge utile de mémoire - vous êtes de la bonne manière ..
Un terme plus couramment utilisé pour la même chose est Pointeur suspendu .