为手动内存管理实现可为空的引用

时间:2014-05-08 18:04:39

标签: pointers memory-management runtime reference-counting

,呃,"遗产" BlitzPlus programming language有一个有趣的功能,旨在使手动内存管理"安全"对于新手程序员来说,与他们可能在一种语言中可能遇到的悬挂指针问题相比,他们希望他们管理像C这样的原始指针。当一个对象被删除时,对该对象的所有引用都成为对null的引用:

Local a.Foo = New Foo
Local b.Foo = a
Delete a
; at this point, b = null

如何实施这样的系统?


原始实现使用隐藏的自动引用计数。 Delete实际上并没有释放一个对象,它只是设置一个"身份"字段到null - 所以在上面的例子中,变量b仍然指向它之前所做的相同对象,但为了进行比较,该对象已被标记为等于null。在对象的隐藏引用计数达到零之前,不会释放内存本身。 (如果这是一个奇怪的决定,那可能是:语言的后继者明确忽略了Delete,并且只使用了引用计数系统并将其称为GC。)

有一些关于这个设计的事情让我感到有些不安:

  1. 传统观点认为引用计数很慢。它也浪费了记忆的整个单词(恐怖!)。
  2. 据我所知,引用计数与多线程不兼容,或者只是兼容性很差(我认为开发人员的逻辑是"多线程永远不会接受")。
  3. 手动Delete操作员实际上并没有手动管理内存! (虽然它可以提供稍微更多的控制,而不是完全将它留给refcounter,因为它可以打破周期并急切地减少拥有对象的数量。)
  4. 无论如何,BlitzPlus现在是开源的,因此我想尝试实现它,因为这是允许的(为了挑战的乐趣)。如果这是一种全新的语言设计,那么显而易见的答案是"使其被垃圾收集",但它不是:现有语言有Delete所以实现必须与之合作这一点。


    有没有明显的方法来实现这个没有上述的缺点和/或气味,也许根本没有refcounts? (我的意思是我可以在后台使用完整的跟踪GC,但这看起来很愚蠢。即使在实现死语言的情况下也是如此。)原始策略实际上和看起来一样糟糕吗?有没有办法获得真实的"手动管理 - 即免费开启 - Delete - 同时仍然归零所有参考文献?

0 个答案:

没有答案