12
votes

Pourquoi la mémoire Malloc dans une fonction et la liberté de l'extérieur est-elle une mauvaise idée?

S'il s'agit d'une mauvaise idée, comment allouer la mémoire dans la fonction?


1 commentaires

Cela pourrait être un stretch pour votre question, mais l'idée est similaire: alloué / libérant la mémoire utilisant des gestionnaires de mémoire distincts. Par exemple, un programme utilise deux bibliothèques qui relient statiquement le temps d'exécution C. Le programme alloue un objet dans une bibliothèque et le libère dans l'autre. C'est mauvais. Si quelqu'un peut mieux expliquer cela, veuillez faire.


5 Réponses :


3
votes

Ce n'est pas nécessairement une mauvaise idée d'allouer la mémoire dans une fonction. Il vous suffit d'être sûr de le nettoyer de manière appropriée.

Le problème est que vous risquez de perdre la capacité de le faire une fois que vous quittez la portée de la fonction.

Soyez juste prudent avec votre conception. Match Up Malloc avec gratuitement à chaque fois et vous n'aurez pas de fuites de mémoire.


0 commentaires

23
votes

Ce n'est pas une "mauvaise idée", mais plutôt "parfois une mauvaise idée", qui peut être dit sur de nombreuses idées de programmation.

Allocation de mémoire à l'intérieur d'une fonction et le libérant à l'extérieur peut être un modèle de conception commun, par le chemin. Envisagez: xxx

ht a été attribué dans une fonction hashtable_new et publié en dehors de cela, mais vous verrez ce modèle sur et plus dans beaucoup de bon code C.

Ce qu'il montre, cependant, est la façon dont la même unité logique (The Hash-Table Adt) s'occupe de l'allocation et de la désaffectation. Cela fait beaucoup de sens - parce que celui qui sait allouer, sait mieux comment négocier. Alloué et libérant dans différents unités logiques est plus souvent une mauvaise idée.


0 commentaires

9
votes

Cette question est la plus facile à répondre si nous inverrons:

  • Pourquoi pourrait-il être une bonne idée si chaque objet Malloc D dans une fonction est également gratuit D dans la même fonction?

    La réponse est Il n'y aura pas de fuites de mémoire ou de points de signalisation dangereux , et ce résultat précieux est atteint sans coopération d'une autre fonction . En conséquence, il est plus facile d'obtenir le code de code, et la fonction a une interface simple.

    Maintenant, que si une fonction appelle malloc mais pas gratuit ? Ensuite, il doit y avoir des règles sur qui est obligé de libérer la mémoire, lorsque cela est autorisé à être fait, et quand il est requis à faire. Ces règles deviennent une partie de l'interface de la fonction et quiconque appelle la fonction doit soit garantir que les règles ou suivies, ou éventuellement imposer des règles similaires sur SON CALLER (S), et bientôt. La gestion de la mémoire explicite ajoute une complexité aux interfaces et plus les interfaces complexes, plus il est facile de faire une erreur qui conduit à une erreur de mémoire et en C, une erreur de mémoire peut rendre votre crash de votre programme.

    Malheureusement, il est parfois nécessaire d'avoir un objet que (a) doit être attribué au temps d'exécution et (B) doit survivre à l'activation de la fonction qui l'attribue. Dans de tels cas, même s'il semble que cela puisse être une mauvaise idée, nous n'avons pas d'autre choix que de faire l'allocation, de compliquer l'interface et d'exiger que l'appelant gère correctement l'objet.

    (l'un des cas plus simples est quand un objet est attribué au moment de l'exécution, mais est autorisé à vivre éternellement. Mais vous devez lier le nombre de tels objets ou vous manquerez d'espace.)


0 commentaires

4
votes

Ce n'est pas une mauvaise idée si vous gardez simplement cela cohérent dans votre propre style.

Une bonne approche consiste à transmettre la mémoire allouée à l'appelant qui peut alors libérer quand c'est fait quand c'est fait. Quelque chose comme ça: p> xxx pré>

puis appelez ceci à partir de votre fonction, comme ceci: p>

char *obj;

my_new(&obj);

/* work on obj */

free(obj)


0 commentaires

0
votes

Il existe certains modèles pour gérer la mémoire:

  1. Pour allouer la mémoire à l'intérieur de la fonction, libérez-le à l'extérieur lorsqu'il survitent le temps de déséquilibre
  2. Pour tenir le pointeur dans la fonction où Malloc est appelé, et la libertte après avoir expiré, comme l'a dit Joveha.

    garder la cohérence à l'esprit, sinon cela conduira facilement à une fuite de mémoire ou à des pointeurs suspendus.


0 commentaires