Question

Est-ce que ça va faire en c?

int *i;
// do stuff

i = NULL;

i = (int *) some_func();
// do stuff

if (i != NULL)
    free(i);

i = NULL;

// do stuff
i = (int *) some_func();
// do stuff
if (i != NULL)
    free(i);

i = NULL;
Était-ce utile?

La solution

1) Cela dépend du contrat que vous avez avec some_func (). Si some_func s'attend à ce que vous appeliez free () sur sa valeur de retour, votre code est ok.

2) Il est correct, bien que pas très élégant, de réutiliser des variables en C. Il est généralement préférable d’utiliser différentes variables à des fins différentes. Du point de vue de la performance et de l’utilisation de la mémoire, c’est complètement la même chose.

Autres conseils

Cela dépend de ce que some_func () fait. S'il alloue de la mémoire avec malloc () , vous devez le free () lorsque vous avez terminé. Si ce n'est pas le cas, vous ne devriez pas. Reportez-vous à la documentation de la fonction pour vous en assurer.

J'appuie la réponse d'Edgar, mais notons également que le test de NULL n'est pas nécessaire:

if (i != NULL)
    free(i);

car free (NULL) est autorisé.

Votre code a l'air correct - de quel bit spécifique parlez-vous? Mais notez que si la fonction retourne un int *, il n’est pas nécessaire de la convertir, et si ce n’est pas le cas, vous ne devriez probablement pas l’affecter à un int *.

Le seul problème que je vois est le problème de lisibilité qui n’est pas uniquement lié à C. Vous avez réutilisé un nom de variable tellement de fois dans un bloc qu’il est très difficile de savoir à quoi il sert.

Si some_func renvoie un pointeur qui pointe vers une mémoire allouée dynamiquement, oui.

C’est acceptable tant que some_func () fait ce qu’elle est supposée faire. S'il attribue une adresse non valide (non allouée) à i, votre programme se bloquera.

Dépend du contrat de some_func ().

Si some_func () alloue de la mémoire et lui attribue la responsabilité de la libérer, alors c'est bien de la libérer (). En fait, c’est un bug de ne pas le faire.

C’est l’une des causes du travail dans une langue non gérée, vous devez suivre les ressources que vous possédez et assurez-vous de les libérer.

Si some_func () " possède " ses données et ne lui renvoie que des pointeurs à inspecter, vous ne devez pas les libérer. Si malloc a été créé pour vous, alors vous êtes bien responsable de faire le free

Dans votre première étape

int *i;
// do stuff

i = NULL;

Si j'ai pointé du doigt quelque chose qui alloue de la mémoire, cette mémoire ne sera-t-elle pas perdue à jamais (fuite de mémoire)?

Par exemple:

int *i;
i = (int*) malloc(sizeof(int);
i = NULL;

laisserait un bloc de mémoire de la taille d'un int laissé flottant dans l'éther.

Il en va de même pour vos exemples some_func (), mais je pense que vous testez correctement pour tenter de libérer tout ce que some_func () a laissé. Surtout si vous ne savez pas comment some_func () fonctionne.

Si some_func () provient d'une bibliothèque, il est possible qu'une fonction free_some_func (i) fasse le travail à votre place.

  

i = (int *) une_fonc ();

Vous n'avez pas précisé le type de retour de some_func () , mais la partie (int *) est un peu suspecte. C est généralement assez indulgent à propos de ces choses, et compile normalement proprement sans avoir besoin d’une distribution explicite. Si ce n’est pas le cas, réfléchissez bien si ce que vous faites est aussi bien défini et portable que vous le souhaiteriez.

@ Kevin Montrose: Hmmm.Oui, exiger des programmeurs qu'ils soient compétents est un véritable casse-tête. Peut-être devrions-nous tous porter des casques pendant que nous élinguerons le code, juste au cas où le plafond tomberait. Et quel est le "contrat"? de some_func ? some_func retourne une valeur appropriée pour passer à free ou ne le fait pas. Il n'y a pas de "contrat". Là. Mais alors, je suis un vieux fou, et ne crois pas à l’obscurcissement pour gagner des points avec la direction. Ce sont des concepts simples.

@caf: cela dépend probablement du compilateur / de la bibliothèque. C'est plus sûr de vérifier comme il le fait. Le fait que votre mise en œuvre de contrôles gratuits pour un pointeur NULL ne signifie pas qu’ils le font tous.

Si vous voulez savoir s'il est correct de réutiliser le pointeur int au lieu d'en déclarer un nouveau à chaque utilisation, assurez-vous que c'est correct, mais en général cela peut être déroutant si tous vos // faire des choses sont constitués de beaucoup de code. Un autre programmeur risque de ne pas bien savoir d'où vient * i et pourquoi cela signifie X ici et Y là-bas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top