初始地址未存储的堆对象是否可以免受垃圾收集的影响?

标签 c pointers garbage-collection

假设

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

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

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

附加信息

据我所知,该程序现在不收集垃圾。但是,如果程序的 future 修订版开始收集垃圾,那么我今天添加的代码可能会突然变成一个难以发现的错误。我不想制造一个难以发现的错误;但是这个程序是一个古老的、稳定的程序,成千上万的用户已经使用了很多年。因此,已知该程序可以在各种实际条件下正常运行。重新设计不是一种选择。

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

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

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

还是我的担心是多余的?无论如何,没有人向旧的 C 程序添加垃圾收集吗?

最佳答案

让我们撇开这样一个事实,即使用 allocate() 但不使用 free() 的程序很难称为“稳定”;

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

你的问题的答案是:

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

如果它是奇异的,它可能正在扫描内存并寻找指向堆内任何地方的指针,而不仅仅是指向内存块的开头。在这种情况下,您就被覆盖了,因为指向字符串中间的指针足以将字符串固定在内存中。 (防止它被垃圾收集。)

如果它不是那么奇怪,那么它只会寻找指向内存块开头的指针。 (这是一个相当明智的做法。)在这种情况下,不,除非您维护指向对象本身的指针,否则您的对象不会被锚定。

就我个人而言,我什至不会尝试使用异国情调的垃圾收集器,但我就是这样。

关于初始地址未存储的堆对象是否可以免受垃圾收集的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41113029/

相关文章:

java - 从 VisualVM 理解堆图

c - 数组未传递给函数方法

c - 这是什么类型的排序算法?

java - 术语:如何谈论 Java 中的指针和引用

c++ - 哪些指针值可以很好地计算?

c# - 特例生命周期分析

java - 为什么G1 Remark阶段的Unloading Action 耗时太长

c - 如何将数组定义为数字字符串的长度?

java - 获取 ttyS0 : 1 input overrun(s)

c - 将 char 缓冲区传递给函数