是否有一种没有指针和显式对象大小管理的语言,但有明确的对象删除?

时间:2014-01-14 14:06:30

标签: memory-management programming-languages

高级语言编码人员通常认为高级GC驱动语言解决的问题是需要手动删除已分配的对象但忘记缓冲区溢出和指针算术错误。是否有一种语言可以完成第二种但是第一种语言在开发者手中?像Java / C#/ etc这样的东西有'删除'关键字?

2 个答案:

答案 0 :(得分:1)

是的。 Pascal。 Pascal不是垃圾收集的。它有新的和freemem分别分配和释放内存。尽管指针算法是可行的,但是在C语言中不需要像C这样的数组访问。在几种Pascal语言中有一个内置的数组类型和字符串类型,许多实现都进行了数组边界检查。

此外,这稍微偏离主题,但您可能对使用RAII内存管理的语言感兴趣。某些RAII语言为您执行内存管理,因此不需要您显式分配和释放内存。但是,它们会将对象生命周期绑定到词法范围而不是引用计数。在这种策略下,解构主义者更有意义。

我不确定它是否是您想要的显式分配和释放,或者它是否更好地理解何时分配内存,即使它自动发生并且能够触发解构器方法。如果你感兴趣的是后者,那么也许可以查看D

答案 1 :(得分:0)

添加到mmachenry's answer

Java和C#中的对象(不包括数组)往往很小,因为这些对象通常包含对其他对象的引用 - 它们实际上不保留空间,以便将字段对象包含在父对象的内存布局中。这与C ++不同。

Java和C#都实现了一种协作确定性对象清理。这种确定性清理旨在处理其他类型的资源,而不是释放对象的内存。

要确保在某些代码的末尾调用它们,

  • 在C#中,在finally块中调用IDisposable.Dispose()。或者,在using块的开头初始化此类对象,前提是该对象永远不会离开该块的范围。
  • 在Java中,在finally块中调用Closeable.Close()。

这些技术被发现是这些语言与以下对象交互所必需的:

  • 以需要显式清理的其他语言(环境)实现,例如Microsoft COM或
  • 表示网络,数据库或操作系统资源,或其他一些容量控制的资源。

阵列是另一回事,因为它们可能会变得很大(兆字节到千兆字节)。如果应用程序使用大量临时固定大小的数组,那么实现数组池可能是有意义的。我在最近的C#项目中使用这种技术进行图像处理。 (注:我的数组池不是单例。)