【问题标题】:freed allocated memory still accessable [duplicate]释放的分配内存仍然可以访问[重复]
【发布时间】:2020-08-19 08:42:13
【问题描述】:

我正在释放一个我使用 malloc 分配的变量,但在我释放它之后我尝试访问它,它仍然可以正常工作。

我预计在访问此内存时会出现分段错误,但我没有得到。

这里有一个简单的例子来说明问题:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *arr = (int*)malloc(5*sizeof(int));
    arr[0] = 2;
    arr[4]=9;
    free(arr);
    printf("%d\n",arr[4]);
    return 0;
}

输出为 9。

【问题讨论】:

  • 欢迎来到未定义行为的美妙世界
  • 作为 4he 程序员,您有责任不编写错误或无效的代码。就像尝试使用不属于您的进程的内存一样。
  • 释放内存并不意味着它无法访问。 C 标准不要求这样的(硬件)机制。记忆还在,只是不再属于你,随时可以重复使用。
  • 阅读this。这不是完全相同的问题,但解释仍然非常适用于您的问题。只需将“怎么可能?局部变量的内存不是在其函数之外无法访问吗?” 替换为“怎么可能?内存不是一旦被访问就无法访问了吗?使用free 函数释放?"

标签: c memory memory-management


【解决方案1】:

很抱歉,问题似乎是您预计会出现分段错误。

C 语言标准不要求分段错误。一旦您访问一个已释放的指针任何事情都可能发生 - 包括任何事情。

很可能,内存分配器缓存内存以供重复使用,而不是将内存返回给系统。这样,如果您需要再次分配内存,第二次分配会更快。

这意味着,从系统的角度来看,您的程序仍然“拥有”该内存。

分配器的角度来看,该内存归分配器所有,您不应该使用它(分配器可能会在那里写入自己的数据)。

从您的程序的角度来看,您有一个相当的错误。

【讨论】:

    猜你喜欢
    • 2020-12-28
    • 2021-08-11
    • 2016-06-10
    • 1970-01-01
    • 2012-08-24
    • 2011-12-14
    • 1970-01-01
    • 2010-12-19
    相关资源
    最近更新 更多