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

C++笔记(面向对象)深赋值 浅赋值

深赋值 浅赋值

浅拷贝赋值(浅赋值)

浅拷贝赋值是指在对象赋值时,只是简单地将源对象的成员变量的值(包括指针值)逐位复制到目标对象中。对于指针类型的成员变量,浅拷贝赋值不会为目标对象重新分配新的内存空间,而是让目标对象的指针成员和源对象的指针成员指向同一块内存区域。

class ShallowClass {
public:int* data;// 构造函数,动态分配内存ShallowClass(int val) {data = new int(val);}// 浅拷贝赋值运算符(默认生成的或简单实现的)ShallowClass& operator=(const ShallowClass& other) {if (this != &other) {// 直接复制指针值,没有为 data 重新分配内存data = other.data;}return *this;
}
~ShallowClass() {
delete data; // 析构时释放内存
}
};

在上述代码中,当执行 `ShallowClass obj2 = obj1;`(假设 `obj1` 是已初始化的对象)这样的赋值操作时,`obj2.data` 和 `obj1.data` 会指向同一块堆内存。

问题

当其中一个对象(如 `obj1`)的析构函数被调用,释放了 `data` 指向的内存后,另一个对象(`obj2`)的 `data` 就变成了**悬空指针**(指向已释放的内存)。如果后续再通过 `obj2.data` 访问或操作这块内存,就会导致未定义行为(如程序崩溃、数据错乱等)。

深拷贝赋值(深赋值)

深拷贝赋值则是在对象赋值时,不仅复制源对象成员变量的值,对于指针类型的成员变量,会为目标对象重新分配一块新的内存空间,然后将源对象指针指向的内容复制到这块新内存中,使得目标对象和源对象各自拥有独立的资源副本,互不影响。

class DeepClass {
public:int* data;// 构造函数,动态分配内存DeepClass(int val) {data = new int(val);}// 深拷贝赋值运算符DeepClass& operator=(const DeepClass& other) {if (this != &other) {delete data; // 先释放当前对象已有的资源data = new int(*other.data); // 为当前对象重新分配内存并复制内容}return *this;}~DeepClass() {delete data; // 析构时释放内存}
};
```

当执行 `DeepClass obj2 = obj1;` 这样的赋值操作时,`obj2.data` 会指向一块新的堆内存,这块内存中存储的内容与 `obj1.data` 指向的内存内容相同。

深拷贝赋值保证了每个对象都有自己独立的资源,一个对象对资源的修改(如通过指针修改指向的内容)不会影响到另一个对象,同时在对象析构时,各自释放自己拥有的资源,避免了悬空指针和多次释放同一块内存等问题。

浅赋值:只复制指针值,多个对象共享同一份资源,存在资源管理风险(如悬空指针、重复释放)。

深赋值:为目标对象重新分配资源并复制内容,每个对象拥有独立资源,资源管理更安全。

在实际编程中,当类中包含动态分配的资源(如指针指向堆内存、动态数组等)时,通常需要自定义深拷贝赋值运算符,以确保对象赋值时资源的正确管理;如果类中没有动态资源,使用默认的浅拷贝赋值(由编译器生成)一般不会有问题。

http://www.dtcms.com/a/528121.html

相关文章:

  • 数据库在什么情况下会发生数据库死锁
  • 如何将Word文档精确转换为图片型PDF?
  • Auto CAD二次开发——封装事务处理函数并绘制直线函数
  • C4D域力场重要概念之点对象、粒子对象和通道转换
  • 车载诊断架构 ---关于Service 29证书认证与整车时间同步的问题带来的深思
  • 做蛋糕需要建议网站不wordpress跳转移动端模板
  • html5培训网站模板兴国电商网站建设
  • 【JUnit实战3_13】第八章:mock 对象模拟技术在细粒度测试中的应用(上)
  • STM32项目分享:简易自动门设计
  • 小白怎样建设公司网站奔奔网站建设
  • YouTube评论情感分析项目84%正确率:基于BERT的实战复现与原理解析
  • 【Shell】Shell变量
  • 华为OD机考:计算正方形数量(Python C/C++ JAVA JS GO)
  • 基于 STM32 的语音识别智能垃圾桶设计与实现
  • 【基础复习3】决策树
  • 网站设计公司驻马店市住房和城乡建设局网站首页
  • Microsoft AI Genius | 用智能 Microsoft Copilot 副驾驶® 构建高韧性 DevOps 流程
  • wordpress网站布置电子商务网站建设的心得
  • nicegui 无框模式最小化关闭例子
  • 【气动技术】气动控制元件及其选型计算
  • LCL滤波器传递函数及波特图绘制
  • 银河麒麟v10 sp1更改data目录挂载
  • 在安卓中基于OpenGL ES实现随风飘荡3D动画效果
  • Java坐标转换技术详解
  • AWS Systems Manager:批量服务器管理的隐藏利器
  • 如何分析对手网站关键词网页版游戏平台
  • 招聘网站建设初衷远程数据库 wordpress
  • 驱动隔离芯片:电子系统的安全与效能守护者
  • 【经验】Word/WPS|用邮件合并批量填写表格或教案,单个Word导出成多个文件
  • Git工作流