首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何释放重新分配和计算内存?

如何释放重新分配和计算内存?
EN

Stack Overflow用户
提问于 2019-11-21 17:15:47
回答 4查看 114关注 0票数 0

如何释放曾经在乞讨中被释放过的记忆,然后再重新分配和再分配呢?这个ptr是我的尝试,但val差尔说,已经有6个分配和6个自由,但有90个字节,在3个块肯定丢失。

代码语言:javascript
复制
char *textInFile = (char *) calloc(currentLength + 1, sizeof(char) * currentLength);
char *currentLine = (char *) calloc(currentLength + 1, sizeof(char) * currentLineLength);
...
while ((textInFile[index] = getc(f)) != EOF) {
    if (index > currentLength - 3) {
        currentLength += 10;
        ptr = textInFile;
        textInFile = (char *) realloc(textInFile, currentLength);
        textInFile = (char *) calloc(currentLength, sizeof(char) * currentLength);
        free(ptr);
    }
    ...
    if (textInFile[index] == '\n') {
        int k = 0;
        for (int i = previousIndex; i < index; i++) {
            if (k > currentLineLength - 3) {
                currentLineLength += 10;
                ptr = currentLine;  
                currentLine = (char *) realloc(currentLine, currentLineLength);
                currentLine = (char *) calloc(currentLineLength, sizeof(char) * currentLineLength);
                free(ptr);
            }
    ...
    index++;
}
...
free(textInFile);
free(currentLine);

==4426==堆摘要:

退出时使用的==4426==:3个块中的90个字节

==4426==总堆使用情况:分配9个分配程序,9个空闲,14668字节分配

==4426==

==4426==泄漏摘要:

==4426==绝对丢失:3个块中的90个字节

==4426==间接丢失:0块中的0字节

==4426==可能丢失:0块中的0字节

==4426==仍然可以到达:0块中的0字节

==4426==被抑制:0块中的0字节

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-11-21 17:21:10

您需要对每个由free()返回的非空指针调用calloc()。如果调用realloc(),则不应该对作为参数传递给realloc()的指针调用free(),但应该对realloc()返回的指针调用free()。(注意:正确地使用realloc()是很棘手的,特别是如果您想正确地处理错误-我建议您避免它,除非它是绝对必要的)

尤其是代码中的一个问题是:

代码语言:javascript
复制
textInFile = (char *) realloc(textInFile, currentLength);
textInFile = (char *) calloc(currentLength, sizeof(char) * currentLength);

在第二行中,您用textInFile返回的指针覆盖calloc()的指针,从而失去了对realloc()返回的旧值的任何访问,因此无法释放该缓冲区;因此出现内存泄漏。

票数 2
EN

Stack Overflow用户

发布于 2019-11-21 17:19:47

我想..。你误解了realloc

realloc不是free

它返回分配内存..。

你的代码

代码语言:javascript
复制
        textInFile = (char *) realloc(textInFile, currentLength);
        textInFile = (char *) calloc(currentLength, sizeof(char) * currentLength);
        free(ptr);

textInFile被分配了两次。第一个指针泄露了..。

票数 0
EN

Stack Overflow用户

发布于 2019-11-21 17:42:22

答案:

ptr应该指向本应被释放的realloc。在这个问题上,自从textInFile被覆盖后,它的原始入口就丢失了。

代码语言:javascript
复制
ptr = (char *) realloc(currentLine, currentLineLength);
currentLine = (char *) calloc(currentLineLength, sizeof(char) * currentLineLength);
free(ptr);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58980353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档