释放的分配内存仍然可以访问[重复]

Posted

技术标签:

【中文标题】释放的分配内存仍然可以访问[重复]【英文标题】: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。

【问题讨论】:

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

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

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

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

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

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

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

【讨论】:

以上是关于释放的分配内存仍然可以访问[重复]的主要内容,如果未能解决你的问题,请参考以下文章

动态内存分配

动态内存分配如何工作[重复]

从 Instruments 读取内存分配结果

动态内存分配

Linux内核中使用内存检测

在kernel中使用内存检测