C++浅拷贝深拷贝

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++浅拷贝深拷贝_c++

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

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

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

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!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值