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?
Répondre
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.
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
@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. –
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.
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.
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. –
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). –
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).
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
- 1. Motifs pour libérer de la mémoire en C?
- 2. Comment libérer la mémoire associée par CGImageCreateWithImageInRect
- 3. Comment savoir quelle fonction de hachage a été utilisée?
- 4. C# Désérialise une classe qui a été déplacée ou renommée
- 5. comment libérer de la mémoire (contrôle utilisateur)
- 6. xsl: comment dire si une variable a été déclarée
- 7. Comment insérer des crochets dans une variable qui a été définie comme une valeur d'une variable dans T-SQL?
- 8. Comment savoir ce qui a été cliqué?
- 9. Comment puis-je transmettre une classe qui a été typedef'd?
- 10. Comment vérifier que la mémoire a été libérée dans Visual Studio C++?
- 11. Comment libérer une poignée via C#?
- 12. Y a-t-il une fuite de mémoire lors de la réaffectation d'une variable?
- 13. Déterminer le nom de la variable utilisée comme paramètre pour une méthode
- 14. Comment puis-je libérer de la mémoire en toute sécurité en supprimant UIImageViews de l'écran?
- 15. Comment libérer de la mémoire à partir de std :: deque?
- 16. Comment afficher la mémoire gratuite de l'iPhone? et comment libérer la mémoire de l'iPhone?
- 17. bouton qui a été taraudés vue alerte
- 18. Comment puis-je libérer ou libérer la mémoire allouée à un fichier .wav?
- 19. Comment libérer la mémoire ACTUAL et pas seulement le pointeur vers la mémoire?
- 20. Comment trouver la mémoire utilisée par un objet en PHP? (sizeof)
- 21. Django inlines, comment sais-je ce qui a été édité?
- 22. Est-ce que x86 a un incrément atomique qui conserve la valeur qui a été stockée?
- 23. Une macro peut-elle être utilisée pour l'accès en lecture seule à une variable?
- 24. Impossible de lire la variable qui a été stockée dans une boucle while, while out of the while
- 25. jQuery - Comment faire pour survoler le code qui a été ajouté en utilisant prepend
- 26. En utilisant une variable pour représenter une fonction dans C
- 27. Déterminez la quantité de mémoire utilisée par une classe?
- 28. Comment forcer hibernate à libérer de la mémoire une fois la session fermée?
- 29. La valeur est une variable mais utilisée comme méthode
- 30. Comment la technologie Web peut-elle être utilisée pour une interface graphique d'application C++?
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