C++ 一次深拷贝与浅拷贝(结构体)引起的 “血案”

C++ memcpy()与拷贝函数的区别


  • memcpy(void*, conut void*, int)
  • 拷贝函数

最近在项目中二次开发智能卡测试平台的Https模块,发现一个BUG

BUG现象

当第二次运行脚本,执行完其中一个子函数,便会在CString释放过程中,程序抛出断言

解决思路

首先看函数内部传参过程,发现有形参被”拷贝”了,猜测自己的拷贝方法有问题,网上了解memcpy以及拷贝函数的原理

BUG原因

调用函数与被调函数之间形参传递后,我用了memcpy将形参(结构体内含指针成员)“复制”给了局部变量,可实际上memcpy不会对new的对象进行拷贝,意味着它可对源地址进行操作,导致被调函数调用析构函数释放局部变量后,先前的调用函数操作了空指针。

解决方法

1、用拷贝函数实现备份即可,例如:

结构体类型 局部变量名;
局部变量名 = 结构体形参

猜你喜欢

转载自blog.csdn.net/dennis_sck/article/details/80328381