当前位置: 首页 > wzjs >正文

深网著名网站免费app大全下载

深网著名网站,免费app大全下载,网站显示备案号,建设和住房保障部 网站🚀 C 深拷贝与浅拷贝详解:从原理到实战 📅 更新时间:2025年6月11日 🏷️ 标签:C | 深拷贝 | 浅拷贝 | 对象拷贝 | 内存管理 | C基础 文章目录 前言📌 一、拷贝基础:浅拷贝与深拷贝究…

🚀 C++ 深拷贝与浅拷贝详解:从原理到实战
📅 更新时间:2025年6月11日
🏷️ 标签:C++ | 深拷贝 | 浅拷贝 | 对象拷贝 | 内存管理 | C++基础

文章目录

  • 前言
  • 📌 一、拷贝基础:浅拷贝与深拷贝究竟是什么?
    • 1.浅拷贝(Shallow Copy)
      • 示例:
    • 2.深拷贝(Deep Copy)
      • 示例:
  • 🔧二、为什么需要关注深拷贝与浅拷贝?
  • 📂三、 案例详解浅拷贝与深拷贝
    • 1.案例背景
    • 2.问题示例
      • 解决方案一
      • 解决方案二
      • 解决方案三 (解决本质问题)
  • 📝总结


前言

在 C++ 编程中,对象的复制操作看似简单,但其中隐藏的内存管理问题往往是初学者最容易踩的地雷。这篇文章将以循序渐进的方式,从最基础的值拷贝地址拷贝讲起,详细解读浅拷贝深拷贝的原理、区别以及应用场景,帮助你构建正确的拷贝语义认识,为后续的封装面向对象知识打下坚实基础


📌 一、拷贝基础:浅拷贝与深拷贝究竟是什么?

1.浅拷贝(Shallow Copy)

浅拷贝是指在复制对象时,只复制对象的基本数据成员(值拷贝),而对于指针成员,仅复制指针的值(即内存地址),而不复制指针所指向的内存内容。换句话说,源对象和新对象共享同一块动态分配的内存

示例:

#include<iostream>
using namespace std;class house
{public:house(int sum):area(sum){p=&area;}~house(){}void where(){cout<<"I live in "<<p<<endl;}int area;int* p;
};int main()
{house a(100);a.where();house b=a;b.where();return 0;
}

输出:

I live in 0x7ffe702f1be0
I live in 0x7ffe702f1be0

我们会发现,house 对象a对象b共享同一块地址这就是浅拷贝

2.深拷贝(Deep Copy)

深拷贝是指在复制对象时,不仅复制对象的基本数据成员,还为指针成员分配新的内存,并将源对象指针指向的内容复制到新分配的内存中。新对象和源对象完全独立,互不影响

示例:

输入:

#include<iostream>
using namespace std;int main()
{int a=10;int b=a;cout<<"a地址:"<<&a<<endl;cout<<"b地址:"<<&b<<endl;return 0;
}

输出:

a地址:0x7fffb62b7a80
b地址:0x7fffb62b7a84

我们会发现a和b是独立分开的,这就是深拷贝

🔧二、为什么需要关注深拷贝与浅拷贝?

在 C++ 中,类的默认拷贝行为(由编译器提供的默认拷贝构造函数和赋值运算符)是浅拷贝。如果你的类管理动态内存(如指针成员),默认的浅拷贝可能导致以下问题:

1.悬空指针(Dangling Pointer):

如果两个对象共享同一块内存,当一个对象销毁时释放了这块内存,另一个对象的指针会变成悬空指针,访问它会导致未定义行为。

2.内存泄漏(Memory Leak):

如果没有正确管理动态内存,可能会导致内存无法释放。

3.数据不一致:

修改一个对象的动态内存内容会意外影响另一个对象。

因此,在涉及动态内存的类中,通常需要显式实现深拷贝,以确保对象的独立性和程序的正确性

📂三、 案例详解浅拷贝与深拷贝

1.案例背景

此时有一个类,里面包含两个变量,一个是面积area,一个是指向area地址的指针p
相当于此时你需要去购买房子,房子的面积为area,此房子所配的钥匙为指针p

假设我们的类是这样写的!假设!

class house
{public:house(int sum):area(sum){p=malloc(area);//给所买的房子分配一把钥匙}~house(){free(p);p=nullptr;}void where(){cout<<"I live in "<<p<<endl;}int area;//房屋面积void* p;//指向房子的地址  相当于钥匙
};

2.问题示例

如果对象a购买了一处房产,b也想购买一处与a一样大小的房产,下面写法会不会出错?为什么?

#include<iostream>
using namespace std;class house
{public:house(int sum):area(sum){p=malloc(area);}~house(){free(p);p=nullptr;}void where(){cout<<"I live in "<<p<<endl;}int area;void* p;
};int main()
{house a(100);a.where();house b=a;//本意是想购买与a房子同样大小的房子b.where();return 0;
}

输出:

I live in 0x55ce6707deb0
I live in 0x55ce6707deb0
free(): double free detected in tcache 2!!!!!报错

为什么会错呢?我们仔细看看对象a和对象b的地址,发现都相同,说明此时共享同一块内存地址,当对象a进行析构的时候会将指针置空,但轮到对象b析构的时候,就产生了对空指针再次清除的报错

解决方案一

我们在构造对象b的时候换一种方式就行

	house a(100);a.where();house b(100);b.where();

输出:

I live in 0x55efdd689eb0
I live in 0x55efdd68a330

解决方案二

我们修改类,不用mallco去主动为p分配内存

#include<iostream>
using namespace std;class house
{public:house(int sum):area(sum){p=&area;}~house(){}void where(){cout<<"I live in "<<p<<endl;}int area;int* p;
};int main()
{house a(100);a.where();house b=a;b.where();return 0;
}输出:
I live in 0x7ffd4341c5a0
I live in 0x7ffd4341c5a0

但这样并没有解决问题的本质,本质上对象a和对象b还是同一个内存

解决方案三 (解决本质问题)

本质问题是一个深拷贝和浅拷贝的问题,我们要进行深拷贝,要独立地址
所以我们在类里面可以这样修改

#include<iostream>
using namespace std;class house
{public:house(int sum):area(sum){p=&area;}house(const house&a):area(a.area)//深拷贝构造{p=&area;}~house(){}void where(){cout<<"I live in "<<p<<endl;}int area;int* p;
};int main()
{house a(100);a.where();house b=a;b.where();return 0;
}输出:
I live in 0x7ffdf435f970
I live in 0x7ffdf435f980

这样就解决这个问题了

通过简单的案例来理解深拷贝与浅拷贝,本质上就是是否共享同一个内存区域的问题

📝总结

浅拷贝 适用于仅含基本数据类型的对象;

深拷贝 适用于含有动态内存或指针的对象,防止资源重复释放或共享;

如果你觉得本文对你有帮助,不妨点赞 + 收藏 + 关注,更多 C++ 系列教程将持续更新 🔥!


文章转载自:

http://dq8BwKkP.fxygn.cn
http://MwH5VZKi.fxygn.cn
http://sjNPtFU6.fxygn.cn
http://ctaqToqD.fxygn.cn
http://BQDaXMsH.fxygn.cn
http://XWBEcE3E.fxygn.cn
http://khXVDvLP.fxygn.cn
http://evz2EX16.fxygn.cn
http://dKs9YkBl.fxygn.cn
http://m9ydRzuM.fxygn.cn
http://a2oeogV3.fxygn.cn
http://jBldlZEo.fxygn.cn
http://9cs7G41F.fxygn.cn
http://TXeNUT9B.fxygn.cn
http://1dS2AJep.fxygn.cn
http://nVoOdI3q.fxygn.cn
http://m6LoK97K.fxygn.cn
http://cHe1sDTs.fxygn.cn
http://nhEt02xo.fxygn.cn
http://VVosPAij.fxygn.cn
http://8pL6Pl7k.fxygn.cn
http://ZR7psHJm.fxygn.cn
http://UzpY3P4u.fxygn.cn
http://xkJSrdw1.fxygn.cn
http://vt419QlJ.fxygn.cn
http://mHlNFvC0.fxygn.cn
http://PSnyZA9g.fxygn.cn
http://dTHY7k9A.fxygn.cn
http://8cZaFQPm.fxygn.cn
http://qG27B00p.fxygn.cn
http://www.dtcms.com/wzjs/765634.html

相关文章:

  • 国家建设网站在哪些网站可以做企业名称预审
  • 职教集团网站建设方案网站建设与维护总结
  • 网站 ipc 备案做网站亏本
  • 四川关于工程建设网站西安网站建设APP开发
  • 网站二级目录制作凡客诚品帮助中心页面
  • 网站愉建设asp手机网站源码
  • 广州电商网站开发wordpress电影主题免费下载
  • 免费网站免费在线观看成都家具企业网站建设
  • 网站备案规则app开发好还是网站开发好
  • 招商网站平网站平台网站策划书的要点
  • 免费域名分发网站网站设计培训学院
  • 企业云服务优化大师会员兑换码
  • ih5做自适应网站百度全网营销
  • 漂亮网站设计深圳做英文网站
  • 最新新闻事件今天300字深圳市seo网站设计哪家好
  • pc网站如何做spwordpress 备案链接
  • 网站的照片上传的功能怎么做大连建设网水电煤气费查询网
  • 无锡新区做网站公司海报设计培训
  • 网创项目资源网站网站建设课程学习
  • 微网站可以做成域名访问电子商务网站的建设和维护论文
  • 网站开发建设明细报价表网站空间域名购买
  • 北京网站建设电扬科技wordpress静态化缓存
  • 做网站都不赚钱了吗免费网站导航建设
  • 彭州建设局网站河北省住房建设厅网站
  • 国外怎么做直播网站网站如何申请微信支付
  • 门户网站建设方案中信息公开专业的河南网站建设公司排名
  • 广州网站建设与网页设计建设银行网银显示网站丢失
  • 广东加盟网站建设3liang 设计网站 源码
  • 官方网站建设公司免费下载网页模板
  • 网站飘窗建设合同电子商务网站建设的核心硬件