【问题标题】:How does free () frees memory when 0 is encountered?free()遇到0怎么释放内存?
【发布时间】:2020-09-26 00:06:55
【问题描述】:

我有一个关于 C 函数 free() 的问题。 如果首先我为 char-string 分配内存,然后将 '\0' 传递到字符串的任何位置并将新指针设置为 '\0' 之后的下一个位置,会发生什么? 如果在我尝试在初始指针上使用 free 之后,是否存在内存泄漏?还是编译器知道终止位置并释放所有分配的内存? 手册上说“释放指针,由 malloc 分配”,但我对这个过程仍然没有完全了解。

有一个例子:

#include "stdlib.h"
int main()
{
    int i = 0;
    char* test = (char*)malloc(sizeof(char) * 100);
    char s = 'a';
    for (int i = 0; i < 10; i++)
        test[i] = s;
    test[10] = '\0';
    char* v = (test + 6);
    test[4] = 0;
    free(test);
    return 0;
 }

Valgrind 说:

地址 0x522d048 是一个大小为 100 的块中的 8 个字节,已释放

【问题讨论】:

  • free()不关心被释放的内存块的内容。完全没有。

标签: c gcc memory-leaks valgrind free


【解决方案1】:

malloc 保留内存供您使用并返回指向该内存的指针。在内部,malloc 记住有关该内存的信息。特别是,它会记住它保留了多少。

当相同的指针传递给free 时,free 将终止保留。

一旦保留结束,您就不应使用任何内存。在您的示例中,当您调用 free(test) 时,malloc(sizeof(char) * 100) 保留的 所有 内存将被释放。您在其中放置一个空字符并稍后拥有数据的事实是无关紧要的。您仍然有一个指向内存中某处的指针 v 的事实是无关紧要的。 free 释放所有已分配的内存,无论内容如何。

(这并不意味着尝试使用内存将不起作用。在您调用free后,该内存不再保留供您使用。但可能没有任何事情阻止您使用它— 如果您尝试,则不会保证会发生陷阱。但也有可能会发生陷阱,或者您的程序中的其他软件可能会使用该内存,因此您对它的使用可能会干扰。)

【讨论】:

    【解决方案2】:

    malloc 的内存分配分配请求的字节数并返回一个指向分配范围开头的指针。 函数free() 仅在您传递malloc 返回的指针时释放范围。传递给free 的任何其他指针都会调用“未定义行为”。

    这两个函数都不知道也不关心你在分配的字节范围内放置了什么信息。

    此外,释放 NULL 指针没有任何作用,因为根据 NULL 的标准值进行内部检查。

    【讨论】:

    • 学究式地定义了free(NULL)malloc() 和朋友们没有返回的任何非空指针,现在......
    • @Shawn True,我应该添加这个。
    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 2011-07-18
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多