【问题标题】:Malloc'ed memory returned by function is not being freed函数返回的 Malloc 内存没有被释放
【发布时间】:2020-12-24 17:31:40
【问题描述】:

下面我使用函数input来收集字符串并将其返回给函数ma​​in。 我将返回的指针/字符串存储在 char* 中,并在使用该变量后释放分配的内存。

但是,在我的 free 调用之后,分配的内存似乎仍然可用。

char* input();
const int MAX = 100;

int main() {
    while(1) {
        char * input_function_pointer = input();

        printf("%p", &input_function_pointer);
        puts(input_function_pointer);   
        
        free(input_function_pointer);
        puts("_______");

        printf("%p", &input_function_pointer);
        puts(input_function_pointer); 
        puts("_______");
    }
return 0;
}

char* input() {
   char * str = malloc(MAX);
   printf( "Enter a value :");
   fgets( str, MAX, stdin );
return str;
}

【问题讨论】:

  • 未定义的行为
  • 基本上,您是在退房后使用酒店房间钥匙。你留在房间里的东西可能在那里,也可能不在那里。
  • @dbush 当拆除费用将其变成瓦砾时,您可能正在酒店房间里......

标签: c malloc free


【解决方案1】:

释放内存不会强制擦除其内容(取决于编译器选项,主要是调试已打开),并且没有什么可以阻止您访问该空间。您处于未定义行为中访问所谓的“悬空指针”:在释放它之后,您可能仍会看到相同的内容,可能不会在调用其他 malloc 之后......或崩溃。

释放内存只是将该空间标记为可分配,而不是阻止进一步的读取(或写入)访问。这也是(也是)为什么 C 被认为是“低级”的原因。

【讨论】:

  • 释放内存不会删除其内容哦?尝试使用调试 C 运行时库...
  • @AndrewHenle 没错,我进行了编辑以使其更清楚可以在某些情况下发生。
【解决方案2】:

如果您在freeing 之后尝试访问一块内存,则无法保证会发生什么。这是未定义的行为,恰好在这种情况下适用于您的特定编译器。

【讨论】:

  • @seamus:“释放”并不意味着“清空”。
  • @seamus 不。您在释放它之后访问的内存仍然存在,并且仍然包含在您释放它之前它所拥有的内容。这两者都不是一个安全的假设。 不能编写依赖于这种行为的代码。
【解决方案3】:

7.22.3.3 免费功能c11

free函数使ptr指向的空间变为 已解除分配,即可供进一步分配

取消引用 dangling pointer 会调用未定义的行为。

【讨论】:

    【解决方案4】:

    free 不会修改已释放内存的内容。它也不会改变指针。

    包含对已释放内存的引用的指针称为 dangling pointer 并且取消引用它(就像您在程序中所做的那样)是一种未定义的行为

    【讨论】:

      猜你喜欢
      • 2012-10-10
      • 2010-09-11
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 2018-08-27
      • 2021-03-09
      • 1970-01-01
      • 2021-04-28
      相关资源
      最近更新 更多