释放的分配内存仍然可以访问[重复]
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 语言标准不要求分段错误。一旦您访问一个已释放的指针任何事情都可能发生 - 包括任何事情。
很可能,内存分配器缓存内存以供重复使用,而不是将内存返回给系统。这样,如果您需要再次分配内存,第二次分配会更快。
这意味着,从系统的角度来看,您的程序仍然“拥有”该内存。
从分配器的角度来看,该内存归分配器所有,您不应该使用它(分配器可能会在那里写入自己的数据)。
从您的程序的角度来看,您有一个相当的错误。
【讨论】:
以上是关于释放的分配内存仍然可以访问[重复]的主要内容,如果未能解决你的问题,请参考以下文章