- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设
我必须存储对象的初始地址吗?假设我不关心初始地址。相反,假设我只关心指向对象内部的一些指针,并且这些指针都是我存储的。假设我把初始地址扔掉了。
垃圾收集器会回收我的对象吗?
附加信息
据我所知,该程序现在不收集垃圾。但是,如果程序的 future 修订版开始收集垃圾,那么我今天添加的代码可能会突然变成一个难以发现的错误。我不想制造一个难以发现的错误;但是这个程序是一个古老的、稳定的程序,成千上万的用户已经使用了很多年。因此,已知该程序可以在各种实际条件下正常运行。重新设计不是一种选择。
该程序采用全局数据结构,它从不理会 free()。这是我必须在其中工作的设计。
如果您想知道:我希望存储的指针——指向对象内部的指针——恰好指向 ASCII 字符串中的单词。我只关心单词,而不关心整个字符串。特别是,我不关心字符串开头的空格,这就是为什么我不关心字符串的初始地址;但是垃圾收集器可能会无意中关心,不是吗?
存储一个我和其他任何人都不会使用的指针链表似乎很愚蠢,只是为了抵御一个不存在的假想垃圾收集器;但如果确实有必要,我会存储该列表。
还是我的担心是多余的?无论如何,没有人向旧的 C 程序添加垃圾收集吗?
最佳答案
让我们撇开这样一个事实,即使用 allocate()
但不使用 free()
的程序很难称为“稳定”;
让我们撇开这样一个事实,即在现有的大型 C 程序中添加垃圾收集是一种“如果你去,只会发现痛苦”的情况。
你的问题的答案是:
这取决于您的垃圾收集器的工作方式。
如果它是奇异的,它可能正在扫描内存并寻找指向堆内任何地方的指针,而不仅仅是指向内存块的开头。在这种情况下,您就被覆盖了,因为指向字符串中间的指针足以将字符串固定在内存中。 (防止它被垃圾收集。)
如果它不是那么奇怪,那么它只会寻找指向内存块开头的指针。 (这是一个相当明智的做法。)在这种情况下,不,除非您维护指向对象本身的指针,否则您的对象不会被锚定。
就我个人而言,我什至不会尝试使用异国情调的垃圾收集器,但我就是这样。
关于初始地址未存储的堆对象是否可以免受垃圾收集的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41113029/
我是一名优秀的程序员,十分优秀!