【问题标题】:Too much heap memory usage when reallocing重新分配时堆内存使用过多
【发布时间】:2020-03-17 20:18:10
【问题描述】:

Valgrind 说分配了 42 718 个字节,但是,当我看到调用重新分配过程的次数时,它是 3 或 6 次,变量 currentLengthcurrentLineLength 是 10 20 30 或 10 20 30 40 50 60,所以问题不在循环中。

char *textInFile = (char *) calloc(currentLength + 1, sizeof(char) * currentLength);
char *currentLine = (char *) calloc(currentLength + 1, sizeof(char) * currentLineLength);
char *ptr, *ptr2;
...
while ((textInFile[index] = getc(f)) != EOF) {
    if (index >= currentLength - 2) {
        currentLength += 10;
        ptr = (char *) realloc(textInFile, currentLength);
        textInFile = (char *) calloc(currentLength, sizeof(char) * currentLength);
        free(ptr);
    }
    if (index > 0) {
        if (textInFile[index - 1] == '\n') {
            goto End;
        }
    }
    if (textInFile[index] == '\n') {
        int k = 0;
        for (int i = previousIndex; i < index; i++) {
            if (k >= currentLineLength - 2) {
                printf("\nCurrent Length: %d\n", currentLineLength);
                currentLineLength += 10;
                ptr2 = (char *) realloc(currentLine, currentLineLength);
                currentLine = (char *) calloc(currentLineLength, sizeof(char) * currentLineLength);
                free(ptr2);
            }
            currentLine[k] = textInFile[i];
            k++;
        }
        previousIndex = index + 1;
    ...
    }
    End:
    index++;
}
free(textInFile);
free(currentLine);
...

valgrind 输出:

==4756== 
==4756== HEAP SUMMARY:
==4756==     in use at exit: 0 bytes in 0 blocks
==4756==   total heap usage: 27 allocs, 27 frees, 42,718 bytes allocated
==4756== 
==4756== All heap blocks were freed -- no leaks are possible
==4756== 

【问题讨论】:

  • 注意,当currentLength == 60calloc(currentLength + 1, sizeof(char) * currentLength);分配61*60字节。我会说总共“分配了 42 718 个字节”看起来是正确的。
  • calloc(a, b) 分配了a*b 字节。你认为它做了什么?
  • @tomashauser calloc() 将两个参数相乘以获得要分配的字节数。这样就分配了(currentlength + 1) * currentlength 字节。

标签: c dynamic-memory-allocation realloc calloc alloc


【解决方案1】:

答案:

void* calloc( size_t num, size_t size );

Calloc 实际上将 num 和 size 相乘。

【讨论】:

    猜你喜欢
    • 2011-12-01
    • 2019-10-23
    • 2019-12-07
    • 2021-01-30
    • 2014-08-14
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多