深复制和浅复制

作者:进击的袋鼠
链接:https://www.zhihu.com/question/23031215/answer/124017500
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1,对于字符串类型,浅复制是对值的复制,对于对象来说,浅复制是对对象地址的复制,并没 有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变,而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。深复制实现代码如下:
可以从两个方法进行解决。
第一种方法、通过递归解析解决
 var china = {
	  	nation : '中国',
	  	birthplaces:['北京','上海','广州'],
	  	skincolr :'yellow',
	  	friends:['sk','ls']
	  }
	  //深复制,要想达到深复制就需要用递归
	  function deepCopy(o,c){
	    var c = c || {}
	    for(var i in o){
	    if(typeof o[i] === 'object'){
	  	   	   	  //要考虑深复制问题了
                      if(o[i].constructor === Array){
                    	//这是数组
                    	c[i] =[]
                    }else{
                    	//这是对象
                    	c[i] = {}
                    }
                    deepCopy(o[i],c[i])
	  	   	   }else{
	  	   	   	 c[i] = o[i]
	  	   	   }
	  	   }
	  	   return c
	  }
	  var result = {name:'result'}
	  result = deepCopy(china,result)
	  console.dir(result)
第二种方法:通过JSON解析解决
 var test ={
	  	name:{
	  	 xing:{ 
	  	     first:'张',
	  	     second:'李'
	  	},
	  	ming:'老头'
	  },
	  age :40,
	  friend :['隔壁老王','宋经纪','同事']
	 }
	  var result = JSON.parse(JSON.stringify(test))
	  result.age = 30
	  result.name.xing.first = '往'
	  result.friend.push('fdagldf;ghad')
	  console.dir(test)
	  console.dir(result)
### C++ 中深复制浅复制的概念及实现方法 #### 一. 概念区分 在 C++ 编程中,深复制浅复制是两种不同的对象复制机制。 - **浅复制**是指仅复制对象的值或指针地址,而不涉及底层资源的实际分配。如果源对象包含指向动态内存的指针,则目标对象也会共享同一块内存区域[^4]。 - **深复制**则是创建一个新的独立副本,不仅复制对象本身,还为其内部的动态数据结构重新分配新的存储空间[^1]。 #### 二. 浅复制的特点及其潜在问题 当使用默认的复制构造函数或者赋值操作时,默认行为通常是浅复制。这意味着两个对象可能共同拥有某些资源(如堆上的内存),这可能导致未定义的行为,比如双重释放等问题。例如: ```cpp class ShallowCopyExample { public: int* ptr; ShallowCopyExample(int value) : ptr(new int(value)) {} ~ShallowCopyExample() { delete ptr; } }; int main() { ShallowCopyExample obj1(10); ShallowCopyExample obj2 = obj1; // 默认调用合成复制构造函数,发生浅复制 } ``` 上述代码中,`obj1` `obj2` 的 `ptr` 成员都指向相同的内存位置,在析构阶段可能会引发两次删除相同地址的情况,从而造成程序崩溃[^3]。 #### 三. 深复制的实现方式 为了防止这种隐患,可以手动定义自己的复制构造函数来完成深复制逻辑。具体做法如下所示: ```cpp #include <iostream> using namespace std; class DeepCopyExample { private: int* data; public: DeepCopyExample(int d) : data(new int(d)) {} // 自定义复制构造函数以支持深复制 DeepCopyExample(const DeepCopyExample& other) : data(new int(*(other.data))) {} void setData(int d) { *data = d;} int getData() const {return *data;} ~DeepCopyExample() {delete data;} }; int main(){ DeepCopyExample original(10); cout << "Original Data: " << original.getData() << endl; DeepCopyExample copy(original); // 调用了自定义的复制构造函数 copy.setData(20); cout << "Copied Data after modification: " << copy.getData() << endl; cout << "Original Data remains unchanged: " << original.getData() << endl; return 0; } ``` 在此示例中,通过重载复制构造函数实现了真正的分离——即使修改了副本的内容也不会影响原始实例的数据[^5]。 #### 四. 总结对比表 | 特性 | 浅复制 | 深复制 | |--------------|----------------------------------|-----------------------------------| | 数据独立性 | 不独立 | 完全独立 | | 内存管理 | 可能导致悬空指针 | 避免了悬空指针 | | 效率 | 较高 | 相对较低 | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值