c++必看——浅拷贝和深拷贝

浅拷贝和深拷贝
1、对于值类型,无论浅拷贝还是深拷贝,都只做简单的值拷贝
2、对于指针或引用类型:
(1)浅拷贝仍只做简单的值拷贝,即拷贝指针或引用保存的指向内容的地址,使得拷贝后的对象与原对象指向同一块内存,这样容易出现内存泄漏(一个对象回收指向的内存后,另一个访问它造成非法访问),适用于拷贝不含指针或引用类型的对象;
(2)深拷贝会拷贝原对象指向的内存区,即不与原对象共享同一块内存,是一个独立的副本,不会与原对象互相影响,缺点是当拷贝的对象很大时,很占用内存等资源

注:一般系统自动生成的拷贝构造函数都是浅拷贝,深拷贝需要自己实现。

代码举例:

#include <iostream>  
#include <string.h>
using namespace std;

class Student
{
private:
    int num;
    char* name;
public:
    Student() {
        name = new char(20);
        cout << "Student" << endl;
    };
    ~Student() {
        cout << "~Student " << &name << endl;
        delete name;
        name = NULL;
    };
    //拷贝构造函数
    Student(const Student& s) {
        //浅拷贝,this的name和入参的name指向相同的地址
        name = s.name;
        //深拷贝
        /*
        name = new char(20);
        memcpy(name, s.name, strlen(s.name));
        */
        cout << "copy Student" << endl;
    };
};

int main()
{
    {
        Student s1;    // 构造
        Student s2(s1);// 拷贝
        //析构s1、s2对象
    }
    system("pause");
    return 0;
}

运行结果:

浅拷贝触发断点,显示是在释放内存时出现错误。编译器会先析构s2再析构s1,即析构s1时出现要释放已被释放内存的现象

深拷贝正常运行

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值