S'il s'agit d'une mauvaise idée, comment allouer la mémoire dans la fonction? P>
5 Réponses :
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. p>
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. p>
Soyez juste prudent avec votre conception. Match Up Malloc avec gratuitement à chaque fois et vous n'aurez pas de fuites de mémoire. P>
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: p> Ce qu'il montre, cependant, est la façon dont la même unité logique em> (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 em> est plus souvent une mauvaise idée. P> p> ht code> a été attribué dans une fonction
hashtable_new code> et publié en dehors de cela, mais vous verrez ce modèle sur et plus dans beaucoup de bon code C. P>
Cette question est la plus facile à répondre si nous inverrons: P>
Malloc code> D dans une fonction est également gratuit code> D dans la même fonction? li>
ul>
La réponse est Il n'y aura pas de fuites de mémoire ou de points de signalisation dangereux em>, et ce résultat précieux est atteint sans coopération d'une autre fonction forte>. En conséquence, il est plus facile d'obtenir le code de code, et la fonction a une interface simple. P>
Maintenant, que si une fonction appelle malloc code> mais pas gratuit code>? 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 em> à faire. Ces règles deviennent une partie de l'interface de la fonction forte> et quiconque appelle la fonction doit soit garantir que les règles ou suivies, ou éventuellement imposer des règles similaires sur SON EM> CALLER (S), et bientôt. La gestion de la mémoire explicite ajoute une complexité aux interfaces forts> 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. p>
Malheureusement, il est parfois nécessaire em> 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. p>
(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.) P>
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> puis appelez ceci à partir de votre fonction, comme ceci: p> char *obj;
my_new(&obj);
/* work on obj */
free(obj)
Il existe certains modèles pour gérer la mémoire: p>
garder la cohérence à l'esprit, sinon cela conduira facilement à une fuite de mémoire ou à des pointeurs suspendus. P>
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.