【发布时间】:2017-04-28 00:54:16
【问题描述】:
假设
- 我正在修改别人的C程序;
- 垃圾收集器处于活动状态;
- 堆上存在我不希望垃圾收集器回收的对象;和
- 对象在程序退出之前一直存在,因此没有必要对其进行 free()。
我必须存储对象的初始地址吗?假设我不关心初始地址。相反,假设我只关心指向对象内部的一些指针,并且这些指针就是我存储的全部。假设我把初始地址扔掉了。
垃圾收集器会收割我的对象吗?
其他信息
据我所知,该程序现在不收集垃圾。但是,如果程序的未来版本开始收集垃圾,那么我今天添加的代码可能会突然变成一个难以发现的错误。我不想制造一个难以发现的错误;但该程序是一个古老的、稳定的程序,成千上万的用户已经使用了很多年。因此,已知该程序在各种实际条件下都可以正常运行。重新设计不是一种选择。
该程序使用全局数据结构,它从不打扰 free()。这是我必须工作的设计。
如果你想知道:我希望存储的指针——指向对象内部的指针——恰好指向 ASCII 字符串中的单词。我只关心单词,而不关心整个字符串。特别是,我不关心字符串开头的空格,这就是为什么我不关心字符串的初始地址;但是垃圾收集器可能会无意中关心,不是吗?
存储一个我和其他任何人都不会使用的指针链接列表似乎很愚蠢,只是为了抵御一个不存在的假设垃圾收集器;但如果真的有必要,我会存储列表。
还是我的担心毫无根据?无论如何,没有人在旧的 C 程序中添加垃圾收集吗?
【问题讨论】:
-
C?垃圾收集?不计算...
-
@John3136:就我个人而言,我对垃圾收集知之甚少,这就是我问的原因。然而,无处不在的 Hans-J. Boehm seems to think C 可以进行垃圾收集。为什么他这么认为,我不知道。我至少和你一样困惑。
-
一切皆有可能——一直如此。为什么你认为你需要担心它?
-
@John3136:有问题的错误可能是在数千个面向公众的服务器上引发堆栈粉碎攻击,这是一个潜在的安全漏洞。
-
鉴于您只存储指向结构内部的指针,您何时以及如何访问结构开头的数据?如果答案是“你不知道”,那么为什么要在指向内部的最低地址指针之前存储数据,从而避免焦虑。如果您确实访问了开头,您可以执行诸如在结构中添加指向结构开头的指针之类的操作吗?这些对象只有一个,还是有很多?如果只有一个,您当然可以简单地在某处存储一个指向它开头的指针,以防止 GC 收集它。
标签: c pointers garbage-collection