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

假设

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

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

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

附加信息

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

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

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

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

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

让我们抛开一个事实,即使用allocate()而不是free()程序很难被称为“稳定”;

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

你的问题的答案是:

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

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

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

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