Question

Je regardais un exemple ici :https://blog.parasoft.com/finding-memory-leaks-in-c

#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char *string, *string_so_far;
    int i, length;     length = 0;
    for(i=0; i<argc; i++) {
        length += strlen(argv[i])+1;
        string = malloc(length+1);

        /*  * Copy the string built so far. */
        if(string_so_far != (char *)0)
            strcpy(string, string_so_far);
        else *string = '\0';
        strcat(string, argv[i]);
        if(i < argc-1) strcat(string, " ");
        string_so_far = string;
    }
    printf("You entered: %s\n", string_so_far);
    return (0);
}

et lisez cela lorsque nous exécutons le programme avec les arguments suivants :

hello this is a test

La variable string_so_far pointe vers la chaîne « bonjour » qui a été attribuée à la suite de l'itération de boucle précédente.Mais je ne comprends pas comment ?Une explication étape par étape serait vraiment utile.

Deuxièmement, je suis tombé sur cet exemple dans le matériel de cours :

int countPrimes(int n)
{
   PrimeSet *p = new PrimeSet(n);
      return( p->countPrimeNumbers() );
}

Il a été déclaré qu'il y avait une fuite de mémoire ici, mais je ne comprends pas vraiment comment, probablement parce que je ne suis pas sûr de ce qui se passe exactement ici.

Était-ce utile?

La solution

Dans le premier exemple, vous utilisez malloc à l'intérieur d'une boucle pour une variable.Le malloc call réserve un bloc de mémoire et renvoie la première adresse du bloc.Vous devez supprimer pour bloquer avec free si vous n'en avez plus besoin.Si le programmeur souhaite étendre le bloc mémoire, la meilleure alternative serait realloc.En savoir plus sur realloc à http://www.cplusplus.com/reference/cstdlib/realloc/.

Dans votre deuxième exemple, l'objet dans lequel le pointeur p pointe vers est initialisé sur le tas et restera dans le tas jusqu'à ce que le programmeur utilise delete.Une alternative plus sûre pour créer des objets sur le tas consiste à les créer sur la pile, ce qui supprimera toutes les données une fois l'appel d'une méthode terminé.

int countPrimes(int n){
   PrimeSet p(n);
   return( p.countPrimeNumbers() );
}

Si la gestion de la mémoire n'est pas effectuée correctement comme dans le deuxième exemple, l'objet ne peut pas être supprimé après la perte de la seule référence à celui-ci, d'où une fuite de mémoire.

Autres conseils

Dans votre deuxième exemple, vous allouez de l'espace pour un objet PRIMESET et que vous initiez, puis vous appelez la fonction CountPriménumbers.L'objet Primeset existe toujours, il occupe toujours la mémoire, il a probablement alloué plus de mémoire, et toute cette mémoire est toujours occupée mais pas accessible.C'est une fuite de mémoire: la mémoire occupée mais inutilisable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à cs.stackexchange
scroll top