12
votes

La mémoire d'un réseau (caractère) est-elle libérée en sortant de la portée?

Très très lié à My Question précédente , mais j'ai trouvé que ceci soit un problème distinct et je suis incapable de trouver une réponse solide à cela.

est la mémoire utilisée par un réseau (caractère) libéré par la sortie de la portée?

Exemple: xxx

Ainsi, après la méthode1 appel, est la mémoire utilisée par STR (10 octets) libérées ou dois-je expliquer explicitement gratuitement ce De plus,

Mon intuition me dit que ceci n'est qu'un tableau simple de types primitifs, il est donc automatiquement libéré. En cas de doute parce que dans C, vous ne pouvez rien supposer que rien ne soit automatiquement libéré. ​​


0 commentaires

8 Réponses :


18
votes

Dans ce cas, non, vous n'avez pas besoin d'appeler gratuitement. La valeur "STOR" est une valeur basée sur la pile qui sera nettoyée lorsque cette méthode / périmètre est excitée.

Il vous suffit d'appeler gratuitement sur des valeurs explicitement créées via malloc.


2 commentaires

(Où "non" signifie - oui, c'est gratuit en sortant de la portée, et non, vous n'avez pas besoin d'appeler facilement explicitement)


@ jManning2k j'ai relu mon message aussi et édité-le pour être un peu plus clair sur ce que "non" signifiait



1
votes

Non, les variables locales de ce type sont attribuées sur la pile. Ainsi, lorsque vous revenez de la procédure, la mémoire est disponible pour l'appel de la fonction suivant, qui utilisera la mémoire de son cadre de pile.

Si vous utilisez masloc () L'espace est attribué sur le tas, qui doit être explicitement libéré. ​​


0 commentaires

9
votes

Il est automatiquement libéré. Si vous n'avez pas maloc cela, vous n'ai pas besoin de le libérer. Mais cela n'a rien à voir avec ça être un "tableau simple de types primitifs" - il serait libéré s'il était une gamme de structures. Il est libéré parce que c'est une variable locale.

étant donné que vous posez ces questions très fondamentales, Je dois demander quel manuel C utilisez-vous. Personnellement, je ne crois pas que vous pouvez utilement apprendre c sans lisant Kernighan & Ritchie's Le langage de programmation C , lequel explique tout ce genre de choses très clairement.


1 commentaires

Je lisais effectivement (et étudié) le langage de programmation C par K & R, mais c'était il y a quelque temps et avant que je me «suis rentré» C moi aussi un peu plus.



0
votes

Je pense que cela est libéré pas parce que c'est des primitives, mais qu'il s'agit d'une variable locale et qui sera allouée sur la pile et non le tas. Si vous ne le faites pas malloc, vous ne pouvez pas la libérer aussi loin que je me souviens.


0 commentaires

0
votes

Oui, c'est "libéré" quand il sort hors de portée.
Non, vous n'avez pas à le libérer explicitement.

Le tableau de caractères est attribué sur la pile, de sorte que lorsque vous revenez de la fonction, cet espace de pile est réutilisable. Vous n'avez pas besoin de libérer explicitement la mémoire.

bonne règle de base: si vous malloc , vous devez gratuit .


2 commentaires

La question concerne environ C, pas C ++


Ah, oui, en effet. Laissez-moi résoudre ça.



3
votes

Oui, c'est "libéré". (Pas gratuit () 'ed, cependant.)

Puisque STR est une variable automatique, elle ne durera que tant que sa portée, qui est jusqu'à la fin du bloc de fonction.

Notez que vous libérez uniquement () ce que vous malloc ().


0 commentaires

2
votes

Oui, la mémoire est libérée automatiquement une fois que Méthode1 retourne. La mémoire de STR est allouée sur la pile et est libérée une fois que le cadre de pile de la méthode est nettoyé. Comparez ceci à la mémoire allouée sur le tas (via malloc ) que vous devez explicitement libérer.


0 commentaires

0
votes

Je suis un peu rouillé en C / C ++ dernièrement, mais je pense que vous avez raison. Tant que vous n'avez pas dynamiquement allouer de manière dynamique cette mémoire, ça devrait aller bien.


0 commentaires