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

当CPU为32位处理器时,以下代码中的内存丢失,c,memory,memory-leaks,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; /* i

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

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;
}
函数
char*string\u 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*));
谢谢,
thetna

您没有显示
内存空闲
的实现(也没有
内存空闲
),因此我们不知道为什么需要将要释放的内存块的假定大小作为第二个参数传递(标准
空闲()
不需要这个参数)。然而,在这里

memory_Free(Connections[i],sizeof(char));
这肯定是错误的:
sizeof(char)
在大多数平台上都是1,但分配的块大小对于数组中的每个字符串至少是4字节(因为字符串包含“c_”加上至少一个数字加上终止的“\0”)

更新 通过查看您链接的源代码,这似乎确实是您的问题的原因!
memory\u Free
中的代码似乎与内存块大小对齐-我可以假设它与4字节边界对齐,这是非常常见的。在这种情况下,如果传递的
Size
为1,则恰好将其更正为4-对于如上所示的单个数字,正好是正确的值!但是,大于9的数字转换为(至少)两位数字,因此转换后的字符串大小已经是5。一个5字节的块很可能在引擎盖下被分配为一个8字节的对齐块-但是由于
内存空闲
总是以
大小
为1来调用,所以它总是只释放4个字节。这使得9以上的每个数字都有4个字节泄漏,正如您在上面的评论中所描述的那样

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

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

您没有显示
memory\u Free
(也没有
memory\u Malloc
)的实现,因此我们不知道为什么需要将要释放的内存块的假定大小作为第二个参数传递(标准
Free()
不需要此参数)。然而,在这里

memory_Free(Connections[i],sizeof(char));
这肯定是错误的:
sizeof(char)
在大多数平台上都是1,但分配的块大小对于数组中的每个字符串至少是4字节(因为字符串包含“c_”加上至少一个数字加上终止的“\0”)

更新 通过查看您链接的源代码,这似乎确实是您的问题的原因!
memory\u Free
中的代码似乎与内存块大小对齐-我可以假设它与4字节边界对齐,这是非常常见的。在这种情况下,如果传递的
Size
为1,则恰好将其更正为4-对于如上所示的单个数字,正好是正确的值!但是,大于9的数字转换为(至少)两位数字,因此转换后的字符串大小已经是5。一个5字节的块很可能在引擎盖下被分配为一个8字节的对齐块-但是由于
内存空闲
总是以
大小
为1来调用,所以它总是只释放4个字节。这使得9以上的每个数字都有4个字节泄漏,正如您在上面的评论中所描述的那样

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

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


你如何判断它是否泄漏?当我更改nc的数量时,它会相应地发生变化。如果nc为10,则为4字节,如果nc为11,则为8字节,依此类推。@thetna,但是你从何处获得引用的字节数?@thetna你是如何观察泄漏的?瓦尔格林?Top?同一个工具有一些内存检查功能,可以显示泄漏的内存。很抱歉,我之前忘了提到它,我也试过valgrind,它没有显示任何泄漏。内存泄漏观察中唯一的区别是采用不同的nc值。如何判断它是否泄漏?当我更改nc的数量时,它会相应更改。如果nc为10,则为4字节,如果nc为11,则为8字节,依此类推。@thetna,但是,你从哪里获得引用的字节数?@thetna你是如何观察泄漏的?瓦尔格林?Top?同一个工具有一些内存检查功能,可以显示泄漏的内存。很抱歉,我之前忘了提到它,我也试过valgrind,它没有显示任何泄漏。内存泄漏观察中唯一的区别是采用不同的nc值。我不确定OP为什么需要大小参数;C
free()
当然没有。
sizeof(char)
的定义是1。@thetna好的,那么为什么有一个size参数呢?@Fred,很好的捕获,修复了。我一定是把它和字节大小混在一起了,而字节大小目前还没有标准化。我的意思是说memory_Free的功能与Free()相同,但它需要两个函数。我添加了memory_Free()的定义。我不确定OP为什么需要size参数;C
free()
当然没有。
sizeof(char)
的定义是1。@thetna好的,那么为什么有一个size参数呢?@Fred,很好的捕获,修复了。我一定是把它和字节大小混在一起了,而字节大小目前还没有标准化。我的意思是说,memory_Free的功能与Free()相同,但它需要两个函数。我添加了memory_Free()的定义。