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

时间:2011-02-01 21:36:57

标签: c memory memory-leaks

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

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

Number int

我正在以下列方式使用此功能

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以4个字节的倍数释放内存时,每次增加数量。如何解决问题。将不胜感激。

编辑

  void memory_Free(POINTER Freepointer, unsigned int Size)

谢谢, thetna

1 个答案:

答案 0 :(得分:3)

你没有显示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字节的块最有可能被分配为8字节的对齐块 - 但是从{ {1}}总是以memory_Free为1调用,它总是只释放4个字节。这会使每个数字上的4个字节泄漏超过9,正如您在上面的评论中所描述的那样!

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

Size