Comment libérer la mémoire qui a été utilisée pour une variable en C?

Comment libérer la mémoire que j’ai utilisée pour une variable (par exemple une longue chaîne) en C?

En supposant que vous ayez alloué la mémoire de manière dynamic (en utilisant malloc ou un autre allocateur de mémoire), vous la libérez en utilisant free . Si la mémoire était allouée de manière statique, vous ne pouvez pas la libérer.

Cela dépend vraiment de la façon dont vous déclarez votre variable – si c’est une variable normale, vous ne pouvez pas “désallouer” sa mémoire – elle sera publiée lorsqu’elle sortira de son champ d’application, comme ici:

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

je serai désalloué lorsque vous quitterez la boucle et k sera alloué et désalloué à chaque passage dans le corps de la boucle.

Quand il s'agit d'allocation de mémoire à l'exécution, vous pouvez utiliser votre fidèle malloc et free 🙂

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

Cela vous donnera un tableau de 200 ints.

En supposant que vous n’utilisez pas malloc et créez 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 partie d’une longue fonction. Vous pouvez simplement placer cette partie de la fonction dans un autre ensemble de {}.

 int reallylongfunction() { // Do a lot of stuff { char ssortingngbuffer[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 scope et libéré. Attention cependant, tout ce que vous déclarez à l’intérieur de l’extra {} ira hors de scope et disparaîtra également!

Edit: Zut, les commentaires sont corrects. Les chaînes statiques sortant du champ d’application ne servent à rien. Edité donc c’est juste un tableau.

Cette question ne peut vraiment pas être répondue sans plus d’informations. Le seul moyen de savoir comment libérer un object (ou même de savoir s’il doit ou non être libéré) est de savoir comment cet object a été alloué.

Et quand je parle d’object, je ne parle pas seulement d’un “object” C ++, mais d’un “object” tel qu’il est utilisé dans le standard C:

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

Je vous suggère de jeter un coup d’œil à ustr , une API de chaîne que vous pouvez utiliser avec des chaînes automatiques, constantes et allouées de manière dynamic. Seules deux d’entre elles sont réellement “libres”, mais vous pouvez toutes les traiter. de la même manière et passez à ustr_free ().

Vous voudrez peut-être encore savoir comment la stack, le tas et les données (chaînes de texte RO) sont “alloués” et “libérés” … mais en utilisant une API utilisable pendant votre apprentissage, cela vous aidera beaucoup ( et vont être beaucoup plus rapides que ce que vous feriez vous-même).