何时在D语言中进行删除操作?

11

我在C++中学习了8年的D语言。我的问题是关于D语言垃圾回收的——什么时候需要使用delete,什么时候不需要?


2
垃圾回收不就意味着根本不需要使用 "delete" 吗? - user395760
2个回答

15
你不需要使用Delete,因为它不能与D版本2一起使用,并且打算从语言中删除。我不确定的是什么原因导致了这个问题。相反,您可以使用一个函数destroy(object),它调用了析构函数,您可以在其中释放非GC内存资源。析构函数将在对象自己的内存的GC收集期间再次被调用。这在“The D Programming Language”中有解释。
这样做的想法是比GC提供更早地回收资源,并防止由悬空指针引起的内存损坏。为了更不安全,core.memory模块提供了GC.free(object),可用于在调用destroy(object)后释放内存。
由于我不是C++程序员,所以我不太了解RAII模式,但如果您希望避免GC,则应该使用此方法和引用计数策略。

3
是的。clear()是用来调用对象的析构函数并将其置于无效状态,但回收内存仍然是由GC负责。delete将完全消失。如果您想完全自己管理内存,可以使用mallocfree。然而,在D代码中使用clear()mallocfree不应该成为常规。它们只是为那些需要的特殊情况提供的。 - Jonathan M Davis
2
谢谢Jonathan,我的意思并不是暗示这种模式很常见。只是这个工具可以做到。这使得Corbin March的回答更好,因为问题本身并不是关于删除的。 - he_the_great

10
请查看D文档中的垃圾回收。注意到,几乎从不需要显式地管理内存。当然,在试图说服您GC的强大之后,他们列出了一些垃圾回收无法解决的情况。为了解决这些问题(他们称之为限制),Digital Mars提供了内存管理的技巧
如果可能,请让D垃圾收集器自行处理。忽略显式的内存管理。在极少数特定情况下,可能会发生无法接受的GC暂停或无法回收的内存情况。如果您的应用程序包含其中之一(测试和分析以证明它),请隔离问题的原因,并在必要时显式地管理内存。 D允许您作为乐观主义者开始。如果事情不能完美地解决,可以放心地回退到显式内存管理。

谢谢 - 我已经查阅了垃圾回收文档,但是它并不清晰,我无法做出任何假设。 - bfops

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接