当前位置: 首页 > 知识库问答 >
问题:

释放内存后,我们如何访问指针?

郭元凯
2023-03-14

根据我的理解,

free()用于释放之前使用malloc分配的内存。

在我下面的片段中,我释放了我分配的内存。但是即使释放后我也能够访问指针?这怎么可能?

free如何在内部工作?

#include<iostream>
using namespace std;

int main()
{
   int *p=(int *)malloc(sizeof(int));
   *p=17;
   free(p);
   *p=*p+1;
   printf("\n After freeing memory :: %d ",*p );
   return 0;
}

共有3个答案

庾奇思
2023-03-14

在空闲(p)之后,是一个悬空指针,指向no wherefree()只释放malloc()分配的内存块,它不会更改进程地址空间中指向堆的指针的值。在某些平台上,如果在释放指针后尝试取消引用,可能会出现segfault。如果在释放后将指针p指定给NULL,这是一种很好的做法。

麹正业
2023-03-14

访问悬空指针将导致未定义的行为。悬空指针是已经释放的指针。

程城
2023-03-14

在调用免费(p)后,您当然可以继续使用p,没有任何东西会阻止您。然而,结果将是完全不确定和不可预测的。它只能靠运气工作。这是一种常见的编程错误,称为“免费后使用”,在许多程序中可以工作多年而不出现“问题”,直到出现问题为止。

有些工具非常擅长发现此类错误,例如Valgrind。

 类似资料:
  • 问题内容: 我将一些matlpotlib函数集成到了一些django-celery任务中。 每次调用任务时,都会将更多RAM专用于python。不久之后,python占用了所有RAM。 问题: 如何释放此内存? 更新2-第二种解决方案: 我问过类似的问题,特别是有关内存锁定matplotlib错误的时候,但是我有一个很好的回答这个问题,以及如果使用多进程运行在单独的进程中绘图功能,其内存会自动释放

  • 我正在创建一个应用程序,当我单击一个按钮时,它将在new中打开一个表。但我的问题是,当我关闭该表的时,应用程序不会释放内存。JavaFX有什么问题吗?还是我得做点别的? 我尝试在该阶段结束时将所有内容设置为空,但仍然没有释放内存。 表的舞台上的关闭事件: 表视图; 舞台我的舞台; 我已经创建了一个名为replaceScene方法来使用文件为Stage加载场景。它将返回它的控制器和设置的场景进入舞台

  • 问题内容: 有没有一种类似于函数的释放Java内存的方法?还是将对象设置为null并依靠GC是唯一的选择? 问题答案: Java使用托管内存,因此分配内存的唯一方法是使用运算符,而释放内存的唯一方法是依靠垃圾回收器。 该内存管理白皮书(PDF)可能有助于解释发生了什么。 你还可以致电建议垃圾收集器立即运行。但是,Java Runtime做出最终决定,而不是你的代码。 根据Java文档, 调用gc方

  • 问题内容: 我想从带有ctypes的C / C ++库中获取一些字符串到python中。我的代码如下所示: lib中的代码: Python代码: 如果我print()c_str,一切都在那里。问题是(或似乎是)在最后一行Python中。我无法释放内存- 库得到了错误的指针。我在这里做错了什么?(并且请不要建议boost :: python左右)。 问题答案: 正如David Schwartz指出的

  • 问题内容: 我编写了一个Python程序,该程序作用于大型输入文件,以创建代表三角形的数百万个对象。该算法是: 读取输入文件 处理文件并创建一个三角形列表,以其顶点表示 以OFF格式输出顶点:顶点列表,后跟三角形列表。三角形由顶点列表中的索引表示 在打印出三角形之前必须先打印出完整的顶点列表的OFF要求意味着在将输出写入文件之前,必须将三角形的列表保留在内存中。同时,由于列表的大小,我遇到了内存错

  • 问题内容: 我应该在将分配的字符串传递给之后释放它吗? 我有一些类似的代码: 在将字符串传递给之后释放字符串时,出现错误。如果我删除呼叫,该错误消失。我究竟做错了什么? 我看到矛盾的意见。有人说我应该自己释放它,有人说VM释放它,有人说VM不释放它,而您应该用奇怪的巫术魔术来释放它。我很困惑。 问题答案: 参数to 的存储完全由您负责:如果您分配了,则需要它。因此,您发布的代码段是正确的。您正在其