我的理解
当结构体中没有指针时,可进行浅拷贝,数据也会从一个结构体拷贝到另一个结构体(两个结构体都存一份数据)。但当结构体中有指针的时候,假如使用使用浅拷贝,会使两个结构体使用的指针都指向同一个内存地址,在析构的时候会造成内存泄漏。
深拷贝:需要对含有指针的结构体,使用“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的地址写入数据&#