Je sais comment utiliser La seule chose que je peux penser est appelant MALLOC () code> et
gratuit () code> Pour allouer la mémoire, mais existe-t-il également une fonction C standard pour vérifier la quantité de mémoire gauche, donc Je peux appeler cela périodiquement pour vous assurer que mon code n'a pas de fuites de mémoire? P>
malloc (1) code> dans une boucle sans fin jusqu'à ce qu'il renvoie une erreur, mais il ne faut pas y avoir de manière plus efficace? P>
5 Réponses :
Non, il n'y a pas de fonction C standard c pour le faire. Il existe certaines fonctions spécifiques à la plate-forme que vous pouvez utiliser pour effectuer certains types de requêtes (comme la taille du jeu de travail), mais celles-ci ne seront probablement pas utiles, car parfois la mémoire qui a été correctement Si vous souhaitez rechercher des fuites de mémoire, je vous recommande vivement d'utiliser un outil tel que Valgrind , qui exécute votre programme dans une machine virtuelle de Tremples et peut suivre des fuites de mémoire, entre autres caractéristiques. P>
Si vous exécutez sous Windows, vous pouvez utiliser gratuit () code> D est toujours considéré comme alloué par le système d'exploitation car la mise en œuvre
MALLOC CODE> pourrait garder la mémoire libérée autour d'une piscine. P>
_crtdbgreport code>
et / ou _crtsetdbggflag code>
pour vérifier les fuites de mémoire. P>
Le programme est le microprogramme exécuté sur un processeur Cortex M0 et utilise beaucoup d'appels / instructions spécifiques à bras, alors je pense qu'il serait difficile d'analyser pour Valgrind, et j'ai à peine suffisamment de mémoire sur l'appareil pour exécuter mon propre code, laisser seul pour ajouter une machine virtuelle.
Dans ce cas, mesurez la quantité de mémoire que vous avez au début de l'exécution et écrivez des fonctions Wrapper autour de MALLOC code> et
gratuit code> pour décrémenter et incrémenter de votre point de départ, car loreb suggère dans une autre réponse.
Si vous pouvez vous permettre # ifdef'ing une version de débogage (éventuellement dans un émulateur!), vous pouvez simplement créer une version de débogage de MALLOC / GRATUITE qui conserve le nombre d'octets actuellement en cours d'utilisation et "Imprimer" périodiquement (à nouveau - uniquement dans la version de débogage, éventuellement sous un émulateur) sur le périphérique de sortie que vous avez pour débogage (une LED?), et voir si elle continue d'augmenter. P>
Le truc standard consiste à allouer de la taille de (Taille_T) plus que demandé, stockant ainsi la taille avec la mémoire nouvellement attribuée - mais si vous écrivez un micrologiciel, je suppose que vous le savez déjà :) P>
Alors ... Avez-vous un émulateur? P>
Edit: Je suis tellement habitué aux ordinateurs courants à GHz que cela ne m'a pas eu au début, mais bien sûr une autre chose que vous puissiez faire est de compter le nombre d'allocations, pas de leur taille - je peux 't Imaginez comment cela pourrait prendre trop de mémoire pour courir. P>
Si dans votre système Si, d'autre part, échantillon code: p> sortie ( IDEONE ): P> MALLOC () CODE> alloue toujours la mémoire physique, vous pouvez appeler
MALLOC () code> à plusieurs reprises avec des tailles différentes de 1, mais par des pouvoirs successifs de deux. Ce sera plus efficace. Ci-dessous est un exemple de la façon de le faire.
malloc () code> n'allocie que l'espace d'adressage virtuel sans mapper la mémoire physique, cela ne vous donnera pas ce que vous Vous voulez. p>
Total free: 266677120
Total free: 266673024
Total free: 266673024
Total free: 266673024
Total free: 266673024
Cela ne tient pas compte des octets supplémentaires alloués par certaines implémentations pour chaque tampon Malloc'ed (à des fins d'alignement ou de validation de dépassements de tampon)
@Alfredd Malloc () ne vous laisserait pas les octets de toute façon.
J'ai cherché et a trouvé cette question pour m'aider à faire une application pour animer de nombreuses itérations de fonctions fractales sur plusieurs tableaux de valeurs complexes.
Merci, Alexey Frunze, pour votre code IDONE.C. Il a certainement été utile. P>
bâtiment sur ce que j'ai appris, dans l'espoir de plus utile, j'ai écrit ce qui suit: p> utilisation: p> blocs sans comptage [ block_size em>] p>
blockQquote> entrée: p> sortie: p> i compréhensime ces fonctions dans ma propre application. P> p>
Ces deux extensions GLIBC doivent vous donner le nombre de pages disponibles. Nous pouvons alors simplement multiplier que par la taille des pages SYSCONF (_sc_avphys_pages) code> et
get_avphys_pages () code> strong>
sysconf (_sc_pagesize) code> pour trouver la mémoire totale disponible. P>
Pourquoi ne pas simplement utiliser Valgrind sur votre programme pour vérifier les fuites?
Notez que Calling MALLOC dans une boucle sans fin risque de ne jamais échouer car la plupart des systèmes n'allouent que la mémoire sur première touche i>.
Related: Stackoverflow.com/Questtions/2513505/ ...
@Ben: Tous les
MALLOC CODE> L'appel se réserve une partie de l'espace d'adresses virtuel, de sorte que cela rendra éventuellement une erreur.
@Mike vois mon commentaire à Adam
@Larsmans, True, En fait, MALLOC a également besoin de la mémoire (physique) pour garder une trace des blocs alloués (même si vous laissez tomber les pointeurs). Donc, vous ne pouvez pas malloc pour toujours. Cependant, cela n'aide pas du tout à savoir combien de mémoire est laissée.
Vous pouvez trouver l'adresse en RAM avant de vouloir être détectée. Pour ce faire une valeur spécifique et continuer à le regarder dans Main () pour voir si elle est corrompue
Il n'y a pas de manière standard. Mais votre bibliothèque OS / Compiler / C peut avoir des fonctions supplémentaires pouvant vous donner les informations souhaitées. Afficher que cette information serait utile.