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;
}
标签:const,int,Basic,C++,num,中深,bs,拷贝
From: https://www.cnblogs.com/Jeffxu/p/18350408