【问题标题】:Can I access dynamically-allocated memory if I've "lost" the last remaining pointer to it? [closed]如果我“丢失”了最后一个指向它的指针,我可以访问动态分配的内存吗? [关闭]
【发布时间】:2013-02-04 09:31:01
【问题描述】:

代码如下:

char *p=malloc(200);
p=NULL;

现在我已经清空了p,有什么方法可以再次使用这 200 字节的内存吗?如果没有,我至少可以释放它们吗?

【问题讨论】:

  • 不,你不能,所以不要丢失它。
  • “医生,我的头撞到墙上很痛。我怎样才能不痛?”
  • @R.MartinhoFernandes 把枕头贴在墙上。
  • @stefan 那我就不会撞墙了
  • 我很想知道你为什么要这样做。

标签: c memory-leaks malloc


【解决方案1】:

在致电p=NULL; 之前 使用free(p);

但在释放内存之前,如果你将指针分配给 NULL,它将丢失...

【讨论】:

  • 这不会重新获得内存,从而防止它首先被泄漏。不是一回事
【解决方案2】:

不,你不能把它捐赠给 Mr. No-one one,

p = NULL;

因为Mr. No-one是自私的,他不会把任何给他的东西还给你。只有当您的程序结束并且您的应用程序运行的进程退出时,他才会将其返回给您的操作系统。

【讨论】:

  • He will only give it back to your OS when your program ends and the process in which your application runs exits. 严格地说,在c++ 标签的上下文中,这不是给定的。
  • @LightnessRacesinOrbit:在大多数情况下(read all)它是给定的。
  • 抽象是健康的。
【解决方案3】:

你总是需要一个指针来保存内存位置,否则你无法取回它。

char *p=malloc(200);
char *p2 = p;
p = NULL;
free(p2);   

【讨论】:

  • 指针不“持有” 200 字节的内存块。
  • 很好,他们持有那个 200 字节内存块的句柄
【解决方案4】:

就目前而言,没有办法恢复记忆。您可以防止丢失它,但无法找回它。唯一的选择是退出程序。

【讨论】:

    【解决方案5】:

    这只有在您使用垃圾收集器(例如Boehm-Demers-Weiser collector)时才有可能。如果你不能使用垃圾收集器,那么内存就不能被回收。

    当然,如果你在设置p = NULL之前调用free(p),内存会被回收,但你已经知道了。

    此外,如果您exec()或进程退出,操作系统将自动回收内存。

    【讨论】:

    • the memory is reclaimed if you call free(p) before setting p = NULL, but you knew that already.你确定吗?
    • @LightnessRacesinOrbit:我选择确定。
    • 我想这是你的特权。
    猜你喜欢
    • 2020-09-18
    • 1970-01-01
    • 2015-12-08
    • 2020-09-05
    • 1970-01-01
    • 2018-05-26
    • 2015-06-19
    • 2022-10-12
    • 2017-09-20
    相关资源
    最近更新 更多