C - Vérifier la quantité de mémoire ram disponible?
Je sais comment les utiliser malloc()
et free()
d'allouer de la mémoire, mais est-il aussi une fonction C standard pour vérifier la quantité de mémoire est à gauche, donc je ne peux appeler que périodiquement pour vous assurer que mon code n'a pas de fuites de mémoire?
La seule chose que je peux penser à est de l'appel de malloc(1)
dans une boucle infinie jusqu'à ce qu'il retourne une erreur, mais qui ne devrait pas y avoir un moyen plus efficace?
Pourquoi ne pas simplement utiliser valgrind sur votre programme afin de vérifier les fuites?
noter que l'appel de malloc dans une boucle sans fin est susceptible de ne jamais échouer, car la plupart des systèmes d'allouer de la mémoire sur le premier contact.
Connexes : stackoverflow.com/questions/2513505/...
chaque
Vrai, en fait malloc également des besoins (physiques) de mémoire pour garder une trace de l'blocs (même si vous déposez les pointeurs). Vous ne pouvez donc pas de malloc pour toujours. Cependant, cela n'aide pas à tout savoir de combien de mémoire est à gauche.
noter que l'appel de malloc dans une boucle sans fin est susceptible de ne jamais échouer, car la plupart des systèmes d'allouer de la mémoire sur le premier contact.
Connexes : stackoverflow.com/questions/2513505/...
chaque
malloc
appel réserve une partie de l'espace d'adressage virtuel, donc il finira par retourner une erreur.Vrai, en fait malloc également des besoins (physiques) de mémoire pour garder une trace de l'blocs (même si vous déposez les pointeurs). Vous ne pouvez donc pas de malloc pour toujours. Cependant, cela n'aide pas à tout savoir de combien de mémoire est à gauche.
OriginalL'auteur Muis | 2013-01-17
Vous devez vous connecter pour publier un commentaire.
Non, il n'y a pas de norme C de la fonction pour le faire. Il y a quelques plate-forme spécifique de fonctions que vous pouvez utiliser pour effectuer certains types de requêtes (comme la taille du jeu de travail), mais ceux qui ne seront probablement pas utile, parce que parfois la mémoire qui a été correctement
free()
d est encore considéré comme attribué par le système d'exploitation parce que lamalloc
la mise en œuvre pourrait garder la mémoire libérée dans une piscine.Si vous souhaitez vérifier les fuites de mémoire, je recommande fortement d'utiliser un outil comme Valgrind, qui exécute votre programme dans une machine virtuelle de toutes sortes et de surveiller les fuites de mémoire, entre autres caractéristiques.
Si vous êtes en cours d'exécution sur Windows, vous pouvez utiliser
_CrtDbgReport
et/ou_CrtSetDbgFlag
pour vérifier les fuites de mémoire.Dans ce cas, mesurer la quantité de mémoire dont vous disposez au début de l'exécution et écrire des fonctions wrapper autour de
malloc
etfree
pour décrémenter et d'un incrément à partir de votre point de départ, comme loreb suggère dans une autre réponse.OriginalL'auteur Adam Rosenfield
Si vous pouvez vous permettre des #ifdef avec une version de débogage (éventuellement dans un émulateur!), vous pouvez simplement créer une version de débogage de malloc/free qui conserve le nombre d'octets actuellement en cours d'utilisation, et "imprimer" périodiquement (une fois encore - seulement dans la version de débogage, peut-être sous un émulateur) sur n'importe quel périphérique de sortie que vous avez pour le débogage (une led?), et voir si elle continue à augmenter.
Le truc standard est d'allouer sizeof(size_t) de plus que ce qui est demandé, donc le stockage de la taille de la mémoire nouvellement allouée - mais si vous êtes à la rédaction d'un firmware je suppose que vous le savez déjà 🙂
Alors... avez-vous un émulateur?
EDIT: je suis tellement habitué à des ordinateurs exécutant au GHz qu'il n'a pas eu lieu pour moi à la première, mais bien sûr, l'autre chose que vous pouvez faire est de simplement compter le nombre d'allocations, pas de leur taille, je ne peux pas imaginer comment cela pourrait prendre trop de mémoire pour exécuter.
OriginalL'auteur loreb
Si dans votre système
malloc()
toujours alloue de la mémoire physique, vous pouvez appelermalloc()
à plusieurs reprises avec des tailles différentes pas de 1, mais par les puissances successives de deux. Ce sera plus efficace. Ci-dessous est un exemple de comment le faire.Si, d'autre part,
malloc()
seulement alloue de l'espace d'adressage virtuel sans mappage de la mémoire physique, ce ne sera pas vous donner ce que vous voulez.Exemple de code:
De sortie (ideone):
malloc() ne vous laissez ces octets de toute façon.
OriginalL'auteur Alexey Frunze
J'ai cherché et trouvé cette question pour m'aider à faire une demande pour animer de nombreuses itérations de la fractale de fonctions sur plusieurs ensembles de valeurs complexes.
Merci, Alexey Frounze, pour votre ideone.c code. Il a certainement été utile.
Appuyant sur ce que j'ai appris, dans l'espoir de plus l'utilité, j'ai écrit ce qui suit:
Utilisation:
D'entrée:
De sortie:
J'ai l'intention de re-but le but de ces fonctions dans ma propre application.
OriginalL'auteur Randall Sawyer