繁体   English   中英

当CPU是32位处理器时,以下代码中的内存丢失

[英]Memory loss in following code when the CPU is 32 bit processor

我有一个将整数转换为字符串的函数。

char * Int_String(int Number)
{
    char* result;
    NAT   size = 1;

    if (Number > 9) {
        size = (NAT)log10((double) Number) + 1;
    } else if (Number < 0) {
        size = (NAT)log10((double) abs(Number)) + 2; /* including '-' */
    }
    size++; /* for '\0' */

    result = (char *) memory_Malloc(sizeof(char) * size);
    sprintf(result, "%d", Number);
    return result;
}

NATtypedef unsigned int

Numberint

我以以下方式使用此功能

char *s2;
char **Connections;
Connections = memory_Malloc(nc*sizeof(char*));
char con[]="c_";
k1=1;
for (i=0; i<nc ; i++){
    s2 = Int_ToString(k1);
    Connections[i]= string_Conc(con,s2);  
    string_StringFree(s2);     
    k1= k1+1;
}   

并且函数char* string_Conc(const char *s1, const char *S2)

{ 
    char* dst;

    dst = memory_Malloc(strlen(s1) + strlen(s2) + 1);
    strcpy(dst, s1);
    return strcat(dst,s2);
}

我正在使用以下方法释放其内存:

for(i=0; i<nc; i++){
    memory_Free(Connections[i],sizeof(char));
}
memory_Free(Connections,nc*sizeof(char*));

我遇到的问题是:当nc<=9时,我可以释放所有分配的内存。但是当它>=10等于>=10时,内存泄漏会以4字节的倍数增加,每次增加。 我该如何解决这个问题。我们将不胜感激。

编辑

  void memory_Free(POINTER Freepointer, unsigned int Size)

谢谢,西娜

您没有显示memory_Free的实现(两者都不是memory_Malloc ),所以我们不知道为什么需要传递要释放的内存块的假定大小作为第二个参数(标准的free()不需要这个) )。 但是这里

memory_Free(Connections[i],sizeof(char));

这肯定是错误的: 在大多数平台上 sizeof(char)为1,但是数组中每个字符串的已分配块的大小至少为4个字节(因为字符串包含“ c_”加上至少一位数字加上终止符' \\ 0')。

更新资料

查看链接的源代码,这确实是造成问题的原因! memory_Free内部的代码似乎使内存块大小对齐-我可以假设这是4字节边界,这很常见。 在这种情况下,如果传递的Size为1,则恰好将其校正为4-如上所示,如果是一位数字,则恰好是正确的值! 但是,大于9的数字将转换为(至少)两位数字,因此转换后的字符串的大小已经为5。一个5字节的块很可能在memory_Free分配为8字节的对齐块-但由于memory_Free始终以1的Size调用它,它总是只释放4个字节。 就像您在上面的评论中所描述的那样,每个9以上的数字都会泄漏4个字节!

要解决此问题,您需要将上面的行修改为

memory_Free(Connections[i], strlen(Connections[i]) + 1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM