,呃,"遗产" 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。)
有一些关于这个设计的事情让我感到有些不安:
Delete
操作员实际上并没有手动管理内存! (虽然它可以提供稍微更多的控制,而不是完全将它留给refcounter,因为它可以打破周期并急切地减少拥有对象的数量。)无论如何,BlitzPlus现在是开源的,因此我想尝试实现它,因为这是允许的(为了挑战的乐趣)。如果这是一种全新的语言设计,那么显而易见的答案是"使其被垃圾收集",但它不是:现有语言有Delete
所以实现必须与之合作这一点。
有没有明显的方法来实现这个没有上述的缺点和/或气味,也许根本没有refcounts? (我的意思是我可以在后台使用完整的跟踪GC,但这看起来很愚蠢。即使在实现死语言的情况下也是如此。)原始策略实际上和看起来一样糟糕吗?有没有办法获得真实的"手动管理 - 即免费开启 - Delete
- 同时仍然归零所有参考文献?