实施深度克隆()

Implementing deep clone()

考虑一些 OOP 语言(哪一个并不重要)并假设语言创建者想为每个 [=22] 添加一个 deep clone() 方法=].另外,假设堆是作为树实现的。

How should the language creator implement it?

所以基本上我们可以(在编译时自动)实现一个 clone() 方法并将其添加到适当的虚拟函数中 table。 它将 malloc() 适当的大小,这在 运行 时间内已知,并从源复制到目标。最后,它将 return 指向分配内存的指针。

如果一个字段是指向某个对象的指针,我们将激活它的 clone() 并将结果作为该字段的值。

What problem would arise if the heap was not "tree-based"?
So I really don't know what the answer is. I mean, why is it relevant how the heap was implemented? I'd be glad for help here.

谢谢。

只要对象结构是非循环的,即形成树,您描述的算法就可以正常工作。那么实际上,可以对一个对象进行浅表克隆,然后使用相同的技术继续更新引用其他对象的字段。

但是,如果存在循环(即对象结构不形成树),算法将永远运行。在最简单的情况下,初始对象 o 引用自身:o -> o。创建浅克隆 c1 时,新对象仍然引用旧对象:c1 -> o。此外,旧对象未更改,即我们有 c1 -> o -> o。根据该算法,应该创建从克隆引用的对象的克隆。因为这是一个新的对象,它不同于c1。于是,图片就变成了c1 -> c2 -> o。这已经是错误的,因为深度克隆应该创建的是 c1 -> c1。坏消息是 c2 现在也是要处理的主题。所以,我们得到 c1 -> c2 -> c3 -> o,等等。算法永远循环(直到没有更多的内存来创建新对象)。

为了使算法正常工作,它应该跟踪哪些旧对象已被处理以及为它们创建了哪些新对象。然后,与其盲目地对引用对象进行新的克隆,不如检查旧对象是否已被克隆,如果是,则使用此克隆而不是创建新对象。