C++深浅拷贝

本文探讨了C++中的深浅拷贝概念,特别是在结构体包含指针时的区别。浅拷贝可能导致内存泄漏,而深拷贝通过新建内存空间确保数据独立。在项目实践中,两个模块A和B需要访问同一数据,但必须进行深拷贝以防止数据冲突。作者分享了踩过的坑,包括因浅拷贝造成的内存访问异常,以及在某些情况下看似正常运行的微妙现象。文中还提供了伪代码示例,强调了memcpy在拷贝指针时的注意事项。
摘要由CSDN通过智能技术生成

我的理解

当结构体中没有指针时,可进行浅拷贝,数据也会从一个结构体拷贝到另一个结构体(两个结构体都存一份数据)。但当结构体中有指针的时候,假如使用使用浅拷贝,会使两个结构体使用的指针都指向同一个内存地址,在析构的时候会造成内存泄漏。

深拷贝:需要对含有指针的结构体,使用“new xxx”申请新的内存空间去存储拷贝的数据
浅拷贝:最简单的可以直接使用 “=”进行赋值,不涉及到手动申请内存空间

项目背景

有两个子模块A,B,他们都需要访问同一份数据,但是这两个模块都会对数据进行clear。
数据模块C,将C* data的地址赋值给A模块,则A模块就能直接访问data的数据地址了。
理论上B也需要使用模块C的数据,但是不能使用同一份数据,需要进行深拷贝,将同样的数据存在两个不同的地址。

假数据

class A;
class B;
struct C{
int m;
};

踩过的坑

同一个内存的模块C的数据(假如结构体如上),同时被模块A,B访问;A删除C.m,B又去访问C.m,此时内存中C的数据m已经被A删除,并不存在了。B访问了不存在的地址,即访问了非法内存,因此会造成内存泄漏导致进程崩溃。

还有一个比较有趣的地方:在实机验证的时候,并不会经常导致进程崩溃;这是因为在实际环境中,不断的通过socket在向模块C的地址写入数据&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值