深拷贝与浅拷贝

深、浅拷贝定义:
深拷贝和浅拷贝在程序中较为重要。
深拷贝类似于文件下载、U盘文件拷贝,是在存储介质上开辟一块新的存储区域来存放目标数据。
浅拷贝就如同windows中的快捷方式一样,仅仅是一个指向性的文件,并没有实质性的数据内容。

深、浅拷贝还可以依据内存中的资源重新分配来划分:深拷贝是在程序运行过程中,重新为即将写入的数据划分新的、等大的存储区域,而浅拷贝仅仅为原有数据建立映像(C语言中多为指针),并不会复制具体的数据。

附图:
内存分配图

深拷贝

深拷贝之于内存资源分配:
深拷贝在程序运行过程中,不仅仅是在堆区拷贝数据,还会在栈区拷贝数据,只要是将原有数据全部“备份”一遍,都可以理解为深拷贝。同样的C++代码,有如下三种书写方式,到底哪一种才算是深拷贝?

以下有三个C++代码,通过定义类的有参构造来比较各代码的区别:

例程1:(仅作测试用)

#include<iostream>
using namespace std;
#define size 20
//栈区分配内存资源
class demo
{
private:
    int len;
    int data[size];
public:
    demo(int *src, int max)//有参构造
    {
        if (max < size)
        {
            for (int i = 0; i < max; i++)
                data[i] = *(src + i);
            len = max;
        }
        else
            cout << "指定存储空间过小" << endl;
    }
};

例程2:(仅作测试用)

#include<iostream>
using namespace std;
//指针指向修改
class demo1
{
private:
    int len;
    int *data;
public:
    demo1(int *src, int max)//有参构造
    {
        data = src;
        len = max;
    }
};

例程3:(仅作测试用)

#include<iostream>
using namespace std;
//堆区分配资源
class demo2
{
private:
    int len;
    int *data;
public:
    demo2(int *src, int max)//有参构造
    {
        data = new int[max];
        for (int i = 0; i < max; i++)
        {
            *(data + i) = *(src + i);
        }
        len = max;
    }
};

例程1通过在栈区(也就是程序运行的数据段)分配空间进行数据拷贝;例程2是通过修改指针指向来实现后续数据的访问;例程3则利用了new(等价于C的malloc)在堆区申请内存空间来完成数据拷贝。

通过以上三个例程,说明深浅拷贝不能只局限于内存资源分配区段(是栈区还是堆区)来区分,而应当通过其操作方式即实质来区分!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值