83 votes

Il est toujours OK pour * non * utilisation free() sur mémoire allouée ?

Je suis étudiant en génie informatique, et j'ai un peu l'électronique des cours. J'ai entendu, à partir de deux de mes professeurs (de ces cours) qu'il est possible d'éviter d'utiliser l' free() de la fonction (après malloc(), calloc(), etc.) parce que les espaces de mémoire allouée ne sera probablement pas être utilisé à nouveau pour allouer de la mémoire d'autres. C'est, par exemple, si vous allouer 4 octets, puis à les relâcher, vous aurez 4 octets de l'espace qui ne sera probablement pas être attribué de nouveau: vous disposez d'un trou.

Je pense que c'est de la folie: vous ne pouvez pas avoir un non-jouet-programme où vous allouer de la mémoire sur le tas, sans le relâcher. Mais je n'ai pas les connaissances pour expliquer exactement pourquoi il est si important que, pour chaque malloc() il doit y avoir un free().

Donc: il y a toujours des circonstances dans lesquelles il peut être approprié d'utiliser un malloc() sans l'aide d' free()? Et si non, comment puis-je expliquer cela à mes professeurs?

100voto

unwind Points 181987

Facile: il suffit de lire la source de pratiquement toutes les demi-sérieuse malloc()/free() mise en œuvre. Par cela, je veux dire le réel gestionnaire de mémoire qui gère le travail de l'ensemble des appels. Cela peut être dans la bibliothèque d'exécution, la machine virtuelle, ou système d'exploitation. Bien sûr, le code n'est pas accessible de manière égale dans tous les cas.

S'assurant de la mémoire n'est pas fragmenté, en joignant les trous adjacents dans de grands trous, est très très fréquent. Plus grave allocateurs utilisation plus grave des techniques pour s'en assurer.

Ainsi, supposons que vous n'trois allocations et de-allocations et obtenir des blocs mis en mémoire dans cet ordre:

+-+-+-+
|A|B|C|
+-+-+-+

Les montants de l'allocation individuelle n'a pas d'importance. ensuite, vous gratuit le premier et le dernier, A et C:

+-+-+-+
| |B| |
+-+-+-+

lorsque vous enfin gratuit B, vous (à l'origine, au moins en théorie) à la fin avec l':

+-+-+-+
| | | |
+-+-+-+

qui peut être fragmenté en de juste

+-+-+-+
|     |
+-+-+-+

c'est à dire un unique plus grand bloc libre, pas de fragments de gauche.

Références, comme demandé:

  • Essayez de lire le code pour dlmalloc. J'ai beaucoup plus avancé, une production de qualité de la mise en œuvre.
  • Même dans les applications embarquées, de fragmenter les implémentations sont disponibles. Voir, par exemple, ces notes sur le heap4.c code dans FreeRTOS.

43voto

Angew Points 53063

Les autres réponses déjà expliquer parfaitement bien que les mises en production d' malloc() et free() ne sont en effet fusionner (defragmnent) des trous dans les plus grandes gratuit morceaux. Mais même si ce n'était pas le cas, il serait toujours une mauvaise idée de renoncer free().

La chose est, votre programme alloué (et veut gratuit) ces 4 octets de mémoire. Si il va courir pour une période de temps prolongée, il est fort probable qu'il sera nécessaire d'allouer à seulement 4 octets de mémoire à nouveau. Donc, même si ces 4 octets ne sera jamais fusionnent dans un plus grand espace contigu, ils peuvent être ré-utilisés par le programme lui-même.

10voto

Paul Evans Points 8997

C’est un non-sens total, par exemple, il existe plusieurs implémentations différentes de `` , certains essayent de rendre le tas plus efficace comme Doug Lea ou cette une.

9voto

Luaan Points 8934

Sont vos professeurs travaillant avec POSIX, par hasard? Si ils sont utilisés à l'écriture de beaucoup de petits, minimaliste shell applications, c'est un scénario où je peux imaginer cette approche ne serait pas trop mauvais libération de l'ensemble du segment de mémoire à la fois à la base de loisirs de l'OS est plus rapide que de libérer un millier de variables. Si vous attendez de votre application à exécuter pendant une seconde ou deux, vous pouvez facilement sortir avec pas de répartition à tous.

C'est toujours une mauvaise pratique de cours (améliorations de performances doivent toujours être fondées sur le profilage, pas de vague intuition), et ce n'est pas quelque chose que vous devriez dire aux élèves sans expliquer les autres contraintes, mais je peux imaginer tout un tas de petits-tuyauterie-shell-applications à être écrit de cette manière (si vous n'utilisez pas l'affectation statique simplement). Si vous travaillez sur quelque chose que les avantages de ne pas libérer de vos variables, vous êtes soit en travaillant dans des conditions d'extrême faible latence conditions (dans ce cas, comment pouvez-vous les moyens de payer l'allocation dynamique et C++? :D), ou vous êtes en train de faire quelque chose de très, très mal (comme l'allocation d'un tableau d'entiers par l'attribution d'un millier d'entiers l'un après l'autre plutôt que d'un seul bloc de mémoire).

5voto

Paddy3118 Points 1770

Vous avez mentionné qu'ils étaient électronique professeurs. Ils peuvent être utilisés pour écrire le firmware et le logiciel realtime, étaient en mesure de temps somethings exécution est souvent nécessaire. Dans ces cas, en sachant que vous disposez de suffisamment de mémoire pour toutes les allocations et de ne pas libérer et réaffectation de mémoire peut donner un plus facile de calculer la limite sur le temps d'exécution.

Dans certains régimes, le matériel de protection de la mémoire peut également être utilisé pour s'assurer de la routine complète dans sa mémoire allouée ou génère un piège dans ce qui devrait être très exceptionnelles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X