Ce qui suit est conçu pour prendre un caractère constant de longueur variable et l'imprimer dans un format agréable pour la journalisation. Je suis certain que les lecteurs auront des suggestions sur la façon dont cela peut être amélioré, et je m'en réjouis. Ce qui me laisse perplexe, c'est que je m'attendais à ce qu'il soit nécessaire de libérer() le caractère statique retourné chaque fois que ToHexString() est appelé. Au lieu de cela, je ne vois aucune fuite de mémoire. Même si j'utilise la fonction inline et n'attribue donc pas sa valeur de retour à une variable.Pourquoi aucune fuite de mémoire?
J'ai créé un test simple qui appelle cette fonction dans une boucle, chaque fois avec un paramètre de longueur différente cString et nMaxChars. Puis j'ai regardé le statut de VM. L'allocation de mémoire pour mon programme de test et la mémoire libre n'ont jamais changé.
Il me semble qu'il aurait dû augmenter chaque fois qu'un malloc est appelé et non libre.
static char *ToHexString(const char *cString,int nMaxChars)
{
static char *cStr;
/*if (80>strlen(cString))
nRawChars=strlen(cString);
if (nMaxChars>nRawChars)
nRawChars=nMaxChars;
*/
if (nMaxChars==0)
nMaxChars=80;
printf("There are %i chars\n",nMaxChars);
char *cStr1;
char *cStr2;
char *cStr3;
int nLen=nMaxChars*6;
cStr=calloc(nLen,sizeof(char));
cStr1=calloc(10,sizeof(char));
cStr2=calloc(nLen,sizeof(char));
cStr3=calloc(nLen,sizeof(char));
cStr1[0]='\0';
cStr2[0]='\0';
cStr3[0]='\0';
int nC1=0;
int nRowCnt=0;
for (nC1=0;nC1<nMaxChars;nC1++)
{
++nRowCnt;
if (cString[nC1]==0x00)
snprintf(cStr1,8,"[00] ");
else
snprintf(cStr1,8,"[%02x] ",(unsigned char)cString[nC1]);
if ((nRowCnt%8==0))
{
snprintf(cStr3,nLen,"%s%s\n",cStr2,cStr1);
}
else
snprintf(cStr3,nLen,"%s%s",cStr2,cStr1);
snprintf(cStr2,nLen,"%s",cStr3);
}
snprintf(cStr,nLen,"%s",cStr3);
free(cStr1);
free(cStr2);
free(cStr3);
return(cStr);
}
Voici le programme appelant:
for (i=0;i<100;i++)
{
memset(&cBuff, 0,255);
printf("Reading %s now..\n",cPort);
while (sleep(1)==-1);
nChars=read(nPort, cBuff, 255);
//printf("Read %i chars from %s\n",nChars,cPort);
if (nChars<=0)
printf("Read 0 chars from %s\n",cPort);
else
printf("Read %i chars from %s\n%s\n",nChars,cPort,ToHexString(cBuff,nChars));
}
Votre résolution est probablement trop petite. Votre système d'exploitation alloue probablement 4-8k pages.À moins que vous libérez cela, vous avez une fuite, vous ne pouvez probablement pas le voir parce que ces allocations sont minuscules. –
@Jason - vous avez probablement raison. Je pensais qu'un pointeur statique conserverait la même adresse (il le ferait, s'il appelait calloc une seule fois, puis réallouerait par la suite). –
Exécutez ce code via valgrind, vous verrez la fuite. –