![]() |
1
955
变量A和B表示不同的内存区域,当B分配给A时,两个变量表示相同的内存区域。以后对其中一个的内容所做的修改会立即反映在另一个的内容中,因为它们共享内容。
变量A和B指的是不同的内存区域,当B被分配给A时,A指向的内存区域中的值被复制到B指向的内存区域中。随后对内容的修改仍然是A或B所独有的;内容不共享。 |
![]() |
2
868
浅拷贝尽可能少地复制。集合的浅层副本是集合结构的副本,而不是元素的副本。使用浅层副本,两个集合现在共享单个元素。
|
![]() |
3
171
简言之,这取决于什么指向什么。在浅拷贝中,对象B指向对象a在内存中的位置。在深度复制中,对象A内存位置中的所有内容都被复制到对象B的内存位置。
|
![]() |
4
167
|
![]() |
5
71
如果
如果
B内存地址与A的相同 B和A的内容相同 |
![]() |
6
66
浅复制:将成员值从一个对象复制到另一个对象。
深度复制:将成员值从一个对象复制到另一个对象。
例子:
|
![]() |
7
54
|
![]() |
8
50
我还没有看到一个简短易懂的答案,所以我要试试看。 使用浅复制时,源指向的任何对象也会被目标指向(因此不会复制引用对象)。
|
![]() |
9
38
{想象两个对象:相同类型的A和B _t(对于C++),您正在考虑将A浅/深复制到B} 浅拷贝: 深度复制: 只需复制a的所有成员,在不同位置为B分配内存,然后将复制的成员分配给B以实现深度复制。这样,如果A变得不存在,B在内存中仍然有效。正确的术语应该是克隆,你知道它们都是完全相同的,但又不同(即在内存空间中存储为两个不同的实体)。您还可以提供克隆包装器,通过包含/排除列表决定在深度复制期间选择哪些属性。创建API时,这是一种非常常见的做法。 您可以选择进行浅拷贝 除非 你明白其中的利害关系。当你在C++或C中有大量的指针处理时,做一个对象的浅拷贝是 真正地 一个坏主意。 例如,当您尝试进行图像处理和对象识别时,您需要屏蔽处理区域之外的“不相关和重复运动”。如果您使用的是图像指针,那么您可能有保存这些掩码图像的规范。现在如果执行映像的浅层复制,当指针引用从堆栈中删除时,您将丢失引用及其副本,即在某个点上会出现访问冲突的运行时错误。在这种情况下,您需要的是通过克隆图像来获得图像的深度副本。通过这种方式,您可以检索面具,以防将来需要它们。 与StackOverflow中的用户相比,我的知识不是非常渊博,所以请随意删除此部分,如果您能够澄清,请举一个好的示例。但我真的认为,如果你知道你的程序将运行无限长的一段时间,即通过函数调用在堆栈上进行连续的“push-pop”操作,那么进行浅层复制不是一个好主意。如果你正在向一个业余爱好者或新手演示一些东西(例如C/C++教程的东西),那么它可能是可以的。但是,如果您正在运行一个应用程序,例如监视和探测系统,或者声纳跟踪系统,那么您不应该一直对周围的对象进行肤浅的复制,因为它迟早会杀死您的程序。 |
![]() |
10
35
“ShallowCopy”指向内存中与“Source”相同的位置。 “DeepCopy”指向内存中的不同位置,但内容相同。 |
![]() |
11
31
什么是浅拷贝?
什么是深度复制?
|
![]() |
12
16
在深度复制中,按值存储的字段会像以前一样被复制,但指向按引用存储的对象的指针不会被复制。取而代之的是,对被引用对象进行深度复制,并存储指向新对象的指针。对这些被引用对象所做的任何更改都不会影响该对象的其他副本。 |
![]() |
13
13
“ShallowCopy”指向内存中与“Source”相同的位置“DeepCopy”指向内存中的不同位置,但内容相同。 |
![]() |
14
12
你回来
深度克隆
:
|
![]() |
15
12
我想举个例子,而不是正式的定义。
此代码显示一个 :
此代码显示一个
|
![]() |
16
12
深度复制
浅拷贝 浅复制是对象的逐位复制。将创建一个新对象,该对象具有原始对象中值的精确副本。如果对象的任何字段是对其他对象的引用,则只复制引用地址,即只复制内存地址。 |
![]() |
17
10
|
![]() |
18
9
浅拷贝 常见的 对象 深度复制 -原始对象和深度复制对象中的引用变量引用到 对象
主要课程如下-
原始物体的任何变化都会反映在浅层物体上,而不会反映在深层物体上。
输出- 视基C |
![]() |
19
8
|
![]() |
20
7
在引用调用中,函数的形式参数和实际参数都引用相同的内存位置和值。
|
![]() |
21
7
与浅复制不同,deepcopy构造新的复合对象,并插入原始复合对象的原始对象的副本。
上面的代码打印错误。 让我们看看如何。
原始复合对象
然后我们使用
在图像中,它为外部列表创建了一个新副本。但内部列表仍与原始列表相同。
现在,我们使用
最后打印代码
嗯。 |
![]() |
22
5
|
![]() |
23
4
为了补充其他答案,
|
![]() |
24
4
浅复制不会创建新引用,但深复制将创建新引用。
|
![]() |
25
3
摘自[博客]: http://sickprogrammersarea.blogspot.in/2014/03/technical-interview-questions-on-c_6.html 深度复制 浅拷贝 说明: 使用复制构造函数,我们只需逐个成员复制数据值。这种复制方法称为浅复制。如果对象是一个简单的类,由内置类型组成,没有指针,这是可以接受的。此函数将使用值和对象,其行为不会因浅拷贝而改变,只复制作为成员的指针的地址,而不复制地址所指向的值。然后,该函数会无意中更改对象的数据值。当函数超出范围时,对象及其所有数据的副本将从堆栈中弹出。 如果对象有任何指针,则需要执行深度复制。对于对象的深度复制,内存分配给空闲存储中的对象,并复制指向的元素。深度副本用于从函数返回的对象。 |
![]() |
26
3
我是从以下几句话中理解的。 值类型 将目标对象中的(int、float、bool)字段和对象的引用类型(字符串、类等)复制为 参考资料 在目标对象中。在此情况下,目标引用类型将指向源对象的内存位置。 深度复制将对象的值和引用类型复制到目标对象的完整新副本中。这意味着值类型和引用类型都将被分配一个新的内存位置。 |
![]() |
27
2
浅的 复制是创建一个新对象,然后将当前对象的非静态字段复制到新对象。如果字段是值类型-->执行字段的逐位复制;暂时 参考类型 深的 值类型 --&燃气轮机;将执行引用对象的新副本。要克隆的类必须标记为[Serializable]。 |
![]() |
28
1
在引用同一数组的两个变量中。 但看看这个例子:
表示仅复制克隆数组表示的内存。 如果数组包含值类型对象,则复制值 . 要创建引用类型重复的深度复制,必须在数组中循环并手动克隆每个元素。 |
![]() |
29
1
为了阅读包含完整示例和解释的详细信息,您可以阅读本文 C++ constructors |
![]() |
30
1
为了避免在浅拷贝和简单地给列表分配一个新的变量名之间产生混淆,只需再添加一点。 “假设我们有:
没有数据被复制。我们在内存中的某个地方仍然有相同的3个列表。所有这些都是为了使外部列表除了以前的名称x之外,还可以使用名称y。如果我们这样做
或
这将创建一个与x内容相同的新列表。列表x包含对2个内部列表的引用,因此新列表也将包含对相同的2个内部列表的引用。只有一个列表复制到外部列表。 内部列表尚未复制!此时,您可以从x或y访问和编辑内部列表!
|
![]() |
Reborok · 对象“具有SWT类所尊重的字段”的序列化 7 年前 |
![]() |
Spears · PHP克隆(深度复制) 7 年前 |
![]() |
Naetmul · 深度复制2D可变列表的简明方法是什么? 7 年前 |
![]() |
ascetic652 · 深度复制和动态转换unique_ptr 8 年前 |
![]() |
Nikordaris · ArangoDB将顶点和边复制到邻居 9 年前 |