C++中深拷贝与浅拷贝
C++中深拷贝与浅拷贝常见场景为类的 拷贝构造函数 与 赋值运算符重载 中。
其主要的区别在于指针成员的拷贝上,如果指针成员变量指向的内容位于动态申请的堆内存上,此时浅拷贝只是拷贝了指针变量,会造成多个指针指向同一块内存,当这些对象被析构时,就会造成多次释放同一块内存的问题,即 double free
。
为避免 double free
的问题,一般需要禁用拷贝构造函数和赋值运算符重载,或者重写这两个函数,避免编译器自动生成对应的浅拷贝函数。
/**
* 头文件 .h
*/
class Basic_2
{
public:
Basic_2();
// 重写拷贝构造函数
Basic_2(const Basic_2& bs);
// 赋值运算符重载
Basic_2& operator=(const Basic_2& bs);
~Basic_2();
private:
int* p;
int num;
};
/**
* 实现文件 .cpp
*/
Basic_2::Basic_2():
p(new int(6)), // 动态分配的堆内存
num(1)
{
}
Basic_2::Basic_2(const Basic_2& bs):
p(new int(*bs.p)), // 拷贝的时候重新申请堆内存
num(bs.num)
{
}
Basic_2& Basic_2::operator=(const Basic_2& bs)
{
p = new int(*bs.p); // 重新申请堆内存
num = bs.num;
return *this;
}
Basic_2::~Basic_2()
{
delete p;
p = nullptr;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2023-08-09 git merge 和 git rebase
2023-08-09 git pull 与 git fetch