可以保护未存储初始地址的堆对象免受垃圾回收吗?

时间:2016-12-13 02:54:03

标签: c pointers garbage-collection

假设

  • 我正在修改别人的C程序;
  • 垃圾收集器处于活动状态;
  • 堆上有一个对象,我不希望垃圾收集器收获;和
  • 对象一直存在,直到程序退出,因此没有必要释放()它。

我必须存储对象的初始地址吗?假设我不在乎初始地址。相反,假设我只关心对象内部的一些指针,并且这些指针都是我存储的。假设我抛弃了初始地址。

垃圾收集器会收获我的对象吗?

其他信息

据我所知,该程序现在不收集垃圾。但是,如果该程序的未来版本开始收集垃圾,那么我今天添加的代码可能会突然变成一个难以发现的错误。我不想做一个难以发现的错误;但该计划是一个古老而稳定的计划,已有数千名用户使用多年。因此,已知程序在各种实际条件下可接受地起作用。重新设计不是一种选择。

该程序采用全球数据结构,它从不困扰free()。这是我必须在其中工作的设计。

如果你想知道:我希望存储的指针 - 指向其对象的指针'内部 - 碰巧指向ASCII字符串中的单词。我只关心单词,而不是整个字符串。特别是,我不在乎字符串开头的空格,这就是为什么我不关心字符串的初始地址;但垃圾收集者可能会无意中关心,不是吗?

存储链接的指针列表似乎很愚蠢,我和其他任何人都不会使用它,只是为了抵挡一个不存在的假设垃圾收集器;但如果真的有必要,我会存储清单。

或者我的担忧是没有根据的?无论如何,没有人会将垃圾收集添加到旧的C程序中吗?

1 个答案:

答案 0 :(得分:2)

让我们抛开一个事实,即使用allocate()而不是free()的程序几乎不能被调用"稳定&#34 ;;

让我们抛开一个事实,即将垃圾收集添加到现有的大型C程序中,其中之一就是其中之一"如果你去了,只会发现痛苦"的情况。

您的问题的答案是:

这取决于垃圾收集器的工作方式。

如果它是异国情调,它可能是扫描内存并寻找指向堆内任何位置的指针,而不仅仅是内存块的开头。在这种情况下,您将被覆盖,因为指向字符串中间的指针足以使字符串保持在内存中。 (防止它被垃圾收集。)

如果它不是那种异国情调,那么它只会寻找指向内存块开头的指针。 (这是一个相当明智的事情。)在这种情况下,不,你的对象不会被锚定,除非你保持指向对象本身的指针。

就个人而言,我甚至不会尝试异国情调的垃圾收集器,但那只是我。

相关问题