【问题标题】:Memory loss in following code when the CPU is 32 bit processor当 CPU 为 32 位处理器时,以下代码中的内存丢失
【发布时间】:2011-02-01 21:36:56
【问题描述】:

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

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;
}

NAT 是typedef 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&lt;=9 时,我可以释放所有分配的内存。但是当&gt;=10 每增加一个字节时,内存就会以4 字节的倍数泄漏。我怎样才能解决这个问题。任何帮助将不胜感激。

编辑

  void memory_Free(POINTER Freepointer, unsigned int Size)

谢谢, 特纳

【问题讨论】:

  • 如何判断是否泄漏?
  • 当我改变 nc 的数量时,它会相应地改变。如果 nc 是 10,那么 4 字节,如果 nc 是 11 ,那么 8 字节等等。
  • @thetna,但是你从哪里得到引用的字节数?
  • @thetna 您如何观察泄漏?瓦尔格林?顶?
  • 同一个工具有一些内存检查功能,可以显示泄露的内存。很抱歉我之前忘记提及它,我也尝试使用 valgrind,它没有显示任何泄漏。内存泄漏观察的唯一区别是采用不同的 nc 值。

标签: c memory memory-leaks


【解决方案1】:

您没有展示memory_Free 的实现(memory_Malloc 也没有),所以我们不知道为什么您需要将要释放的内存块的假定大小作为第二个参数(标准 @ 987654323@ 不需要这个)。但是,这里

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

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

更新

查看您链接的源代码,这似乎确实是您的问题的原因! memory_Free 中的代码似乎与内存块大小对齐——我可以假设它是 4 字节边界,这很常见。在这种情况下,如果传递的Size 是 1,它恰好被更正为 4 - 如上所示,对于单个数字来说,这正是正确的值!但是,大于 9 的数字被转换为(至少)两位数,因此转换后的字符串的大小已经是 5。5 个字节的块最有可能被分配为引擎盖下的 8 个字节的对齐块 - 但因为 @ 987654328@ 总是用 1 的 Size 调用,它总是只释放 4 个字节。正如您在上面的评论中所描述的,这会导致每个 9 以上的数字泄漏 4 个字节!

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

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

【讨论】:

  • 我不确定为什么 OP 需要 size 参数; C free() 肯定不会。
  • sizeof(char) 定义为 1。
  • @thetna 好的,那为什么会有尺寸参数呢?
  • @Fred,很好,已修复。我一定是把它和不是按 AFAIK 标准化的字节大小混在一起了。
  • 我的意思是说 memory_Free 的功能与 Free() 相同,但需要两个功能参数。我添加了 memory_Free() 的定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 2010-11-06
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
相关资源
最近更新 更多