2013-03-19 2 views
2

Dans le programme C, s'il y a des mémoires allouées dynamiquement restées non libérées après l'exécution du programme de sortie avec exit(100);, avons-nous des problèmes de fuites de mémoire? Par exemple:Des fuites de mémoire se produisent si exit (code de sortie) dans C?

int main (void) { 
    char str1[] = "Hello World" 
    char *str2; 
    str2 = malloc(strlen(str1 + 1)); 

    if (str2) 
     exit(101); // memory leaks? 

    free(str2); 
    return 0; 
} 
+0

Cela peut dépendre de votre système d'exploitation, mais la réponse est non – Sergio

+0

Le système d'exploitation ne sera probablement pas. Votre * processus * le fait pendant ce bref instant avant qu'il ne se termine réellement. Je suppose que tout le problème est probablement un problème beaucoup plus important que celui que vous allez rencontrer. – WhozCraig

Répondre

3

Non sous les systèmes d'exploitation modernes, non. Le système d'exploitation recueille automatiquement toute la mémoire lorsque le processus meurt. En fait, libérer de la mémoire peut en fait nuire à la performance si le programme quitte malgré tout. La raison est qu'appeler free implique parfois beaucoup de travail - mettre à jour beaucoup de structures, toucher les lignes de cache, etc. En sortant simplement vous ne faites pas tout ce non-sens de l'espace utilisateur et le système prend en charge le démontage de vos données.

+0

Mais c'est toujours une mauvaise pratique de le faire. –

+0

@ H2CO3 Ce n'est pas une mauvaise pratique vraiment. Je me souviens d'un message de R .. où il a préconisé de ne pas libérer de la mémoire juste avant de sortir. – cnicutar

+0

Je me demande quel est le raisonnement. Si R .. a écrit cela, cela doit être vrai, mais je ne vois pas en quoi cela est * pas * un problème conceptuel. –

1

Toute la mémoire allouée de façon dyanmique allouée en utilisant malloc doit être libérée explicitement en appelant free. Pendant que votre programme continue d'exécuter la mémoire non alloué de cette façon peut être appelé une fuite (à condition qu'il ne soit pas utilisé du tout). Cependant, une fois que votre programme/processus retourne l'OS récupère simplement la mémoire allouée au processus. Le système d'exploitation ne comprend pas fuite il récupère simplement ce qu'il a donné au processus.

1

Cela dépend du système d'exploitation. Tous les systèmes d'exploitation modernes (à ma connaissance) libéreront de la mémoire non explicitement libérée par le programme C une fois l'exécution terminée. Ainsi, vous pouvez vous en sortir sans conséquences dans des circonstances normales. En fait, il existe certaines écoles de pensée qui ne recommandent pas de libérer de la mémoire lorsque l'exécution du programme se terminera bientôt car elle est inutile. Cependant, si vous traitez avec des systèmes d'exploitation anciens ou inhabituels qui peuvent être dangereux. Dans certains de ces systèmes, il peut être nécessaire de redémarrer pour libérer à nouveau la mémoire.

Questions connexes