2010-05-03 3 views
5

Disons que j'ai quelque chose comme ...Tableau statique C++ entraînant une fuite de mémoire?

void foo() 
{ 
    char c[100]; 
    printf("this function does nothing useful"); 
} 

Quand foo est appelée, elle crée le tableau sur la pile, et quand il est hors de portée, est la mémoire désallouée automatiquement? Ou est-ce que c est détruit, mais la mémoire reste allouée, sans moyen d'y accéder/de la récupérer sauf de redémarrer l'ordinateur?

+0

Ce tableau n'est pas statique. C'est juste un tableau local (affecté par une pile). –

Répondre

6

est la mémoire désallouée automatiquement?

Oui. Et les destructeurs seront appelés aussi, au cas où vous vous le demanderiez. C'est pourquoi ils sont dans le automatic storage class.

(En fait, pour la plupart des architectures, le programme n'appeler que 100 Destructeurs (le cas échéant), puis déplacent le pointeur de la pile vers l'arrière par 100 * sizeof(T) octets comme « désaffectation ».)

+0

Ok. Merci à tous ceux qui ont répondu. J'étais sûr d'utiliser new/delete, mais quelqu'un m'avait donné l'impression que ce que j'avais posté ne serait pas désaffecté. Comment se termine-t-on dans une situation où un pointeur est supprimé (quand il sort du champ d'application), mais les données vers lesquelles il pointe restent allouées (inaccessibles aussi)? – MDonovin

+0

@MDonovin: Voir la réponse de mmr http://stackoverflow.com/questions/2758970/c-static-array-leading-to-memory-leak/2758985#2758985. – kennytm

0

Il est parti - tout est parti.

Mais la mémoire peut être utilisée immédiatement par la fonction suivante. la pile est juste implémentée comme un pointeur, quand vous faites c [100] elle déplace le pointeur vers le bas de 100 octets pour que la prochaine mémoire demandée arrive après c. Lorsque vous quittez la fonction, le pointeur de la pile revient juste à la position précédente avant d'entrer dans la fonction. C'est un moyen très rapide et efficace de gérer la mémoire par rapport à new/delete/malloc

4

Dans ce cas, oui, la mémoire est désallouée. Si vous aviez fait quelque chose comme:

int var = 100; 
char* c = new char[var]; 

Ensuite, cela resterait derrière une fois la fonction terminée.

Cependant! Vous n'avez pas à redémarrer pour récupérer la mémoire perdue sur un système d'exploitation moderne. Au lieu de cela, la mémoire sera renvoyée une fois le processus (programme) terminé.

3

Pour être clair, il n'y a pas vraiment d'allocation de mémoire ici; il y a une allocation de pile qui a lieu. La différence est importante car la première nécessite un appel de fonction, réservant de la mémoire à partir du système d'allocation, et un hôte de surcharge. En revanche, ce dernier implique simplement d'incrémenter le pointeur de la pile. Les allocations de pile sont toujours beaucoup, beaucoup plus rapides et, sauf dans le cas de bogues impliquant une corruption de pile, sont toujours nettoyées lorsque votre fonction se termine.