Oop 实现深度克隆()

Oop 实现深度克隆(),oop,memory,compiler-construction,heap,heap-memory,Oop,Memory,Compiler Construction,Heap,Heap Memory,考虑一些OOP语言(不管是哪种语言),假设语言创建者希望为每个类添加一个deep clone()方法。此外,给出了堆作为树实现的方法 语言创建者应该如何实现它 因此,基本上我们可以(在编译时自动)实现clone()方法并将其添加到适当的函数虚拟表中。 它将malloc()设置为运行时已知的正确大小,并从源复制到目标。最后,它将返回指向malloced内存的指针 如果一个字段是指向某个对象的指针,我们将激活它的clone(),并将结果作为该字段的值 如果堆不是“基于树的”,会出现什么问题? 所以我

考虑一些OOP语言(不管是哪种语言),假设语言创建者希望为每个类添加一个deep clone()方法。此外,给出了堆作为树实现的方法

语言创建者应该如何实现它

因此,基本上我们可以(在编译时自动)实现clone()方法并将其添加到适当的函数虚拟表中。 它将malloc()设置为运行时已知的正确大小,并从源复制到目标。最后,它将返回指向malloced内存的指针

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

如果堆不是“基于树的”,会出现什么问题?
所以我真的不知道答案是什么。我的意思是,为什么堆是如何实现的?我很高兴能在这里得到帮助


谢谢。

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

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

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