2008-10-11 5 views
1

Comment puis-je libérer la mémoire que j'ai utilisée pour une variable (par exemple une chaîne longue) dans C?Comment libérer la mémoire qui a été utilisée pour une variable en C?

+0

Pourrait être clarifié. Avez-vous alloué dynamiquement cette mémoire? Ou appeler une bibliothèque qui l'a fait pour vous? Essayez-vous de récupérer de la mémoire associée à une variable automatique ou statique? – dmckee

Répondre

13

En supposant que vous ayez alloué dynamiquement la mémoire (en utilisant malloc ou un autre allocateur de mémoire), vous le libérez en utilisant free. Si la mémoire a été allouée statiquement, vous ne pouvez pas la libérer.

+0

Malédictions! Défait à nouveau!Notez que certaines fonctions de la bibliothèque standard appellent malloc ou calloc, et laissent la responsabilité de libérer la mémoire à l'appelant. – dmckee

+0

@dmckee: Il peut y avoir des API tierces ou plates-formes qui vous demandent de libérer() un bloc qu'elles renvoient, mais je ne connais aucune fonction de bibliothèque standard (autre que celles d'allocation - malloc, calloc, et realloc) qui fais ceci. –

1

Cela dépend vraiment de la façon dont vous déclarez votre variable - si elle est une variable régulière vous ne pouvez pas « deallocate » sa mémoire - il sera libéré quand il est hors de portée comme ici:

for (int i=0;i<10;i++) { 
int k=i; 
//do stuff 
} 

je serai libéré lorsque vous quittez la boucle et k sera alloué et désaffecté à chaque passage dans le corps de la boucle.

Quand il est sur l'allocation de mémoire d'exécution, vous pouvez utiliser votre malloc fidèle et libre :)

int* intArray; 
malloc(200 * sizeof(int)); 

Cela vous donnera un tableau de 200 ints.

1

En supposant que vous n'utilisez pas malloc, et que la création d'une chaîne ou un tampon en utilisant

char array[100]; 

Mais vous savez que vous ne l'utilisez que pour une très courte d'une fonction longue, vous pouvez simplement placer cette partie de la fonction dans un autre ensemble de {}

int reallylongfunction() { 
    // Do a lot of stuff 
    { 
     char stringbuffer[100]; 
     // Do stuff with the buffer... 
     // Ok, we're done with the buffer, and don't want it anymore 
    } 
    // Do a lot more stuff 
    return; 
} 

Cela entraînera le tampon hors de portée, et être libéré. Attention toutefois, tout ce que vous déclarez à l'intérieur de l'extra {} sera hors de portée et disparaîtra aussi!

Editer: Bon sang, les commentaires sont corrects. Les chaînes statiques qui sortent du cadre ne font rien de bon. Edité donc c'est juste un tableau.

+0

Le code suggéré ne fera que sortir la variable "chaîne" de la portée en vous sauvant 4 ou 8 octets. Selon la norme C (6.4.5.5), la valeur de la chaîne est un tableau de durée de stockage statique et est donc effectivement allouée de manière permanente. –

+0

Eh bien, vous avez en fait deux copies de la chaîne, et une seule sera publiée si la fonction retourne (_maybe_ plus tôt). Si vous venez de le faire: static const char mystr [] = "..."; alors un compilateur décent mettra juste une version dans votre code (qui ne partira jamais). –

0

Je vous suggère de jeter un oeil à ustr, qui est une API de chaîne que vous pouvez utiliser avec des chaînes automatiques, constantes et allouées dynamiquement ... dont seulement deux vous pouvez réellement "libérer", mais tout cela vous pouvez traiter de la même façon et passer à ustr_free(). Vous pourriez toujours vouloir apprendre comment la pile, le tas et les données (chaînes de texte RO) sont "allouées" et "libérées" ... mais en utilisant une API utilisable pendant que vous apprenez qui va arrêter vous aider vous beaucoup (et vont être beaucoup plus rapide que ce que vous feriez vous-même).

1

Cette question ne peut vraiment pas être répondue sans plus d'informations. La seule façon de savoir comment libérer un objet (ou même savoir s'il doit ou non être libéré) est de savoir comment l'objet a été alloué.

Et quand je dis objet, je veux dire pas seulement un « objet » C++, mais « objet » comme il est utilisé dans la norme C:

région de stockage de données dans l'environnement d'exécution , le contenu de qui peut représenter des valeurs

Questions connexes