相关疑难解决方法(0)

为什么没有内存泄漏?

以下内容旨在获取一个可变长度的常量char,并以一种很好的格式打印出来以进行日志记录.我相信读者会就如何改进这方面提出建议,我对此表示欢迎.

令我困惑的是,我希望每次调用ToHexString()时都需要free()返回的静态char.相反,我认为没有任何内存泄漏.即使我使用内联函数,因此也不会将其返回值赋给变量.

我创建了一个简单的测试,在循环中调用此函数,每次使用不同长度的cString和nMaxChars参数.然后我看了VM的状态.我的测试程序和可用内存的内存分配从未改变.

在我看来,每次调用malloc并且没有空闲时它应该增加.

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);
}
Run Code Online (Sandbox Code Playgroud)

这是调用例程:

for (i=0;i<100;i++)
{ …
Run Code Online (Sandbox Code Playgroud)

c malloc free memory-leaks

4
推荐指数
1
解决办法
803
查看次数

标签 统计

c ×1

free ×1

malloc ×1

memory-leaks ×1