2014-07-01 4 views
-1

I utilisé bibliothèque C malloc pour allouer 8MB mémoire, après l'utilisation de cette mémoire je free pour libérer la mémoire 8MB.Malloc allouant même bloc de mémoire

Mais lorsque j'ai utilisé à nouveau malloc pour allouer 8MB de mémoire, il alloue le même emplacement qu'alloué précédemment.

Comment éviter ce problème et pourquoi cela se produit-il?

EDIT: Je mettre en œuvre un outil pour tester la mémoire principale, si malloc attribue le même bloc de mémoire, il est impossible de vérifier l'ensemble de la mémoire

+3

Qu'est-ce qui vous fait penser que c'est un problème? – John3136

+0

Qu'est-ce qui vous fait penser que c'est un problème? Avez-vous lu la documentation de 'free'? –

+0

S'il vous plaît expliquer pourquoi c'est un problème. Si vous libérez de la mémoire, vous ne devriez pas vous accrocher aux pointeurs. –

Répondre

4

Ce n'est pas un problème en soi, et est par la conception . Les implémentations typiques de malloc vont recycler les blocs de mémoire pour des raisons de performances. Dans tous les cas, puisque malloc renvoie des adresses à partir d'un pool de valeurs limité, il ne peut en aucun cas garantir de ne pas recycler les blocs.

Le seul moyen sûr d'arrêter les blocs de retour de malloc retournés est d'arrêter de les libérer. Bien sûr, ce n'est pas vraiment très pratique. Je suis en train de mettre en œuvre un outil pour tester la mémoire principale. Si malloc alloue le même bloc de mémoire, il n'est pas possible de vérifier toute la mémoire. Votre outil pour tester la mémoire principale ne peut pas être implémenté avec malloc, ni même avec un programme en mode utilisateur. Les systèmes d'exploitation modernes ne vous donnent pas accès à la mémoire physique. Ils présentent plutôt une vision virtualisée de la mémoire. Les adresses de votre programme ne sont pas des adresses physiques, ce sont des adresses virtuelles. Tester la mémoire physique vous oblige à entrer à un niveau beaucoup plus bas que ce qui est possible à partir d'un programme en mode utilisateur.

+0

Ensuite, il y aura de gros morceaux de mémoire inutilisée – Nikhilendra

+1

Désolé, que voulez-vous dire? –

+0

Seulement lorsque la mémoire allouée par 'malloc' est libérée, elle peut être utilisée par un autre programme – Nikhilendra

0

Cela devrait vous aider How malloc works? Pour éviter cela, allouer quelques octets en utilisant malloc/calloc puis libérer le plus gros morceau de la mémoire. BTW ce n'est pas un comportement incorrect pour obtenir la même adresse mémoire. Vous pouvez appeler system() pour exécuter quelques commandes Linux (qui fournissent des options détaillées de mémoire mgmt) à partir de votre code. La gestion de la mémoire principale ne peut pas être effectuée/testée en utilisant malloc/free, elles sont limitées à fonctionner sur le mémoire allouée à votre programme lorsqu'il est en cours d'exécution.

+0

Comment cela se passe-t-il? – Nikhilendra

Questions connexes