9

C++浅拷贝深拷贝_爱写代码的小白程序员的技术博客_51CTO博客

 1 year ago
source link: https://blog.51cto.com/u_15059356/5724467
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

C++浅拷贝深拷贝

精选 原创

1. C++ 浅拷贝

什么是浅拷贝?

一般比较形象的理解,浅拷贝可以理解"值"层面的拷贝,深拷贝可以理解成"内存"上的拷贝,特别是类里面含有指针类型的。

// .h文件
class HasPtrMem
{
public:
HasPtrMem();
HasPtrMem(const HasPtrMem& h);
~HasPtrMem();

void print();
int *p;
};
// .cpp 文件
HasPtrMem::HasPtrMem() : p(new int(0))
{
cout << "HasPtrMem()" << endl;
}

void HasPtrMem::print()
{
cout << *p << endl;
}

HasPtrMem::HasPtrMem(const HasPtrMem& h)
{
*p = *h.p;
}
HasPtrMem::~HasPtrMem()
{
delete p;
}
// main.cpp
HasPtrMem a;
HasPtrMem b(a)
a.print(); // 输出0
b.print(); // 输出0

上面这段代码的执行

HasPtrMem a; // 调用HasPtrMem::HasPtrMem() : p(new int(0))
HasPtrMem b(a) // 实际上是HasPtrMem b = a,调用HasPtrMem::HasPtrMem(const HasPtrMem& h)

此时main函数执行结束后都会调用析构函数对p的内存进行释放,但是,对象b实际上是指向对象b的内存(相当于直接赋值)

C++浅拷贝深拷贝_赋值

如果此时析构函数先对a对象进行析构,此时释放a对象里面指针p的内存,接着再对b对象析构,释放b对象的指针内存,程序crash(由于P的内存实际上在a对象已经被嘎掉了)

所以,类对象里面包含指针数据的,一定要实现深拷贝

2. C++ 深拷贝

深拷贝就是对实际内存进行分配,在对内存的值进行赋值填充(表达不好,有哪个意思懂就可以哈)

C++浅拷贝深拷贝_深拷贝_02

深拷贝代码

// .h文件
class HasPtrMem
{
public:
HasPtrMem();
HasPtrMem(const HasPtrMem& h);
~HasPtrMem();

void print();
int *p;
};
// .cpp文件
HasPtrMem::HasPtrMem() : p(new int(0))
{
cout << "HasPtrMem()" << endl;
}

void HasPtrMem::print()
{
cout << *p << endl;
}

HasPtrMem::HasPtrMem(const HasPtrMem& h)
{
p = new int(*h.p);
}
HasPtrMem::~HasPtrMem()
{
delete p;
}

这就是深拷贝浅拷贝,不注意就会带来坑爹的代码,造成程序嘎嘎crash!!!!!

  • 收藏
  • 评论
  • 分享
  • 举报

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK