C++中的深拷贝与浅拷贝

1. 概念

在C++涉及指针的部分中,有 深拷贝浅拷贝 两个概念,让我们通过例子来理解一下。C++中,字符串是通过首地址来表示的,如图所示:

字符串

图中,字符串用 s1 表示,而 s1 是字符串 “HELLO” 的首地址(字符串以 ‘\0’ 作为结束标志),通过寻址,即可实现字符串操作。下图中创建了一个字符串 s2 ,上面的表示 深拷贝 ,下面的表示 浅拷贝

拷贝

由上图可以看出,深拷贝又创建了一份新的字符串副本, s2 就是字符串副本的首地址,而浅拷贝仅仅是给 s1 起了一个别名 s2 。那么,这两种拷贝方式有什么需要注意的呢?

1.因为 s1s2 指向同一块内存区域,所以,如果 s1 指向的内容发生改变,那么 s2 指向的内容随之改变。
2.如果 s2 原来指向一块内存,在没有释放 s2 指向的内存的情况下就把 s1 浅拷贝给 s2 ,那么 s2 原来指向的空间就发生了内存泄漏,造成程序无法将这块内存还给计算机。(因为此时没有指针指向这块区域)

2. 实际应用

在C++中,有一个 String 类,内部就涉及到了深拷贝和浅拷贝。程序(下面程序块和 String 源码类似)如下:

class String{
   
public:
	String(const char* cstr = 0);  //构造函数
	String(const String<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值