Fonction Calloc Inside

En regardant cette question qui vient d’être posée: Les inconvénients des pointeurs sur des variables statiques feraient-ils quelque chose de ce genre qui serait considéré comme une mauvaise pratique, alors?

char* strpart(char* ssortingng, int start, int count) { char* strtemp; int i = 0; int j = 0; int strL = strlen(ssortingng); if ( count == 0 ) { count = strL; } strtemp = (char*) calloc((count + 1), sizeof(char)); for ( i = start; i < (start+count); i++ ) { strtemp[j] = string[i]; j++; } return strtemp; } 

Désolé, c’est écrit rapidement, mais le principe de base est le suivant: lorsque vous n’utilisez pas de tampon statique dans une fonction, est-il déconseillé d’atsortingbuer de la mémoire à l’intérieur d’une fonction? Je suppose donc parce que cela ne serait pas libéré, n’est-ce pas? Pensé que je devrais demander cependant.

Ce n’est pas une mauvaise pratique, mais cela peut facilement créer des memory leaks (les appelants doivent se rappeler de libérer la mémoire).

Une chose que j’aime faire est d’utiliser une convention de dénomination pour indiquer les fonctions pouvant être allouées. Par exemple, je nommerais cette fonction:

 char* strpart_alloc(char* ssortingng, int start, int count) 

Il est toujours pratique d’allouer de la mémoire de manière dynamic à l’intérieur d’une fonction. FOURNI vous renvoyez un pointeur sur cette mémoire au monde extérieur, de sorte que quelque chose puisse la libérer ou la libérer vous-même au sein de la fonction.

C’est dangereux. J’essayerais de l’éviter quand c’est possible.

Votre hypothèse est correcte – la mémoire ne sera pas libérée automatiquement.

Le problème est que la valeur de retour ici est la mémoire allouée sur le tas, l’appelant de votre fonction doit se souvenir de libérer. Vous allouez ici de la mémoire qui ne sera pas libérée (par vous). C’est toujours une mauvaise idée d’imposer des contraintes à l’utilisateur de votre API.

Parfois (rarement) cela ne peut pas être évité, donc si vous faites cela, assurez-vous de le documenter très clairement.

C’est courant de faire ça. Il vous suffit de noter clairement dans votre documentation “API” qu’il incombe à l’appelant de libérer le pointeur renvoyé lorsque vous avez terminé.

Ce n’est pas une mauvaise pratique. Le fait que la fonction retourne une mémoire calloc (ou calloc ) devient une partie de sa spécification externe. Il devient de la responsabilité de l’appelant de le free quand ce n’est plus nécessaire.

C’est inélégant cependant. Il est inélégant puisqu’il 1) force l’utilisation de la mémoire dynamic, lorsque l’appelant peut préférer l’éviter, et 2) force l’utilisation d’un type spécifique de mémoire dynamic – le type malloc , lorsque l’appelant peut préférer propre mécanisme d’allocation.