quand utiliser soigneusement free () pour libérer la mémoire utilisée par malloc ()?

J’ai lu beaucoup de questions ici dans SO et quelques autres articles concernant la fonction free () en c qui libère la mémoire des variables non utilisées Dans mon cas, j’ai le bloc de code suivant.

char *injectStrAt(char *str, char *strToIn, int pos) { char *strC = malloc(strlen(str) + strlen(strToIn) + 1); strncpy(strC, str, pos); strC[pos] = '\0'; strcat(strC, strToIn); strcat(strC, str + pos); return strC; } 

La fonction ci-dessus que j’utilise pour injecter un bloc de chaîne dans un tableau. J’utilise malloc pour créer un nouveau personnage char* . Dans le cas ci-dessus, dois-je faire free(strC) ? conseils pls.

strC est la valeur de retour de cette fonction, vous n’appelez donc pas free(strC) dans la fonction elle-même. Vous devez le libérer en dehors de la fonction, l’heure à laquelle cette chaîne n’est plus utilisée.

Puisque votre fonction retourne strC , on suppose qu’elle doit restr valide après le retour de cette fonction, donc cette fonction ne doit pas free() ce tampon. Une fois libéré, le tampon n’est plus valide et ne doit donc pas être utilisé.

Votre appelant est responsable de le libérer dans ce cas.

Non, vous ne devriez pas libérer strC dans cette fonction car c’est la valeur de retour de cette fonction. Si vous le faites la déclaration:

 return strC; 

renverra des valeurs inattendues ou des déchets

 char* ssortingngA = injectStrAt(str, strToIn, pos); printf("SsortingngA: %s"); // unexpected value. 

Alors, quand devriez-vous libérer la mémoire? Eh bien, vous devriez le faire après que la valeur de strC soit renvoyée de la fonction injectStrAt() à ssortingngA , dans ce cas particulier. Bien que généralement la mémoire soit libérée lorsque la chaîne ou la variable à laquelle la mémoire a été allouée n’est plus nécessaire.

 char* ssortingngA = injectStrAt(str, strToIn, pos); /... use the ssortingng free(ssortingngA);