【内存】浅拷贝与深拷贝

QImage的深拷贝和浅拷贝以及浅拷贝时与内存池的结合使用 QImage的深拷贝和浅拷贝以及浅拷贝时与内存池的结合使用 Qt在构造QImage时, 默认使用浅拷贝构造对象,形如 QImage(uchar *data, int width, int height, Format format, QImageCleanupFunction cleanupFunction = 0, void *cleanupInfo = 0); QImage(const uchar *data, int width, int height, Format format... 阅读详情

1.相关概念

     浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型), 拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。 

     一般情况下,只需使用系统提供的浅拷贝构造函数即可,但是,如果对象的数据成员包括指向堆空间的指针,就不能使用这种拷贝方式,因为两个对象都拥有同一个资源,对象析构时,该资源将经历两次资源返还,此时必须自定义深拷贝构造函数,为创建的对象分配堆空间,否则会出现动态分配的指针变量悬空的情况。

     深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。

2.浅拷贝-shallow copy

#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <iostream>
using namespace std;
class MyString
{
    public:
        MyString(const char *str = "")
        {
            if(str == NULL)
            {
                data = new char[1];
                data[0] = '\0';
            }
            else
            {
                data = new char[strlen(str)+1];
                strcpy(data,str);
            }
            
        }
        ~MyString()
        {
            cout << "~MyString " << data << endl;
            delete []data;
            data = NULL;
        }
    public:
        char* data;
};
int main()
{
    MyString s1("hello");
    MyString s2 = s1;
    cout << "s1.data's address is " << (void*)(s1.data) << endl;
    cout << "s2.data's address is " << (void*)(s2.data) << endl;
}

3.深拷贝-deep copy

#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <iostream>
using namespace std;
class MyString
{
    public:
        MyString(const char *str = "")
        {
            if(str == NULL)
            {
                data = new char[1];
                data[0] = '\0';
            }
            else
            {
                data = new char[strlen(str)+1];
                strcpy(data,str);
            }
            
        }
        MyString(const MyString& s)
        {
            data = new char[strlen(s.data)+1];
            strcpy(data,s.data);
        }
        
        MyString& operator=(const MyString& s)
        {
            if(this!= &s)
            {
                delete []data;
                data = new char[strlen(s.data) + 1];
                strcpy(data,s.data);
            }
            return *this;
        }
        

        ~MyString()
        {
            cout << "~MyString " << data << endl;
            delete []data;
            data = NULL;
        }
    public:
        char* data;
};
int main()
{
    MyString s1("hello");
    MyString s2 = s1;
    cout << "s1.data's address is " << (void*)(s1.data) << endl;
    cout << "s2.data's address is " << (void*)(s2.data) << endl;
    MyString s3;
    cout << "s3.data's address is " << (void*)(s3.data) << endl;
    s3 = s2;
    cout << "s3.data's address is " << (void*)(s3.data) << endl;

}

 

详细分析Python中深浅拷贝的区别 Python 中的深拷贝和浅拷贝 阅读详情

相关推荐

Python中的深拷贝和浅拷贝的区别

深拷贝和浅拷贝是Python中非常重要的概念,它们在处理对象和数据结构时有着截然不同的行为。理解深拷贝和浅拷贝的区别以及适用场景对于面试和实际编程工作都非常有帮助。在选择深拷贝和浅拷贝时,需要根据具体的需求和数据结构来决定。

这家伙很懒,什么都没有留下 2349

彻底理解Python中浅拷贝和深拷贝的区别

Python浅拷贝只复制某个对象的引用,而不复制对象本身,新旧对象还是共享同一块内存。Python深拷贝会创造一个一摸一样的对象,新对象和原对象不共享内存,修改新对象不会改变原对对象。

专注自动化、性能测试、测试架构学习交流 1万+

实现单芯片2400bps 音频编解码方案

终于按照朋友的需求,帮他开发了一款单芯片集音频采集编码传送并接收解码播放功能的方案,交给快递公司邮寄给远在郑州的他.整个项目从开始定型到现在一个样机送出,整整花了1个月时间,感觉挺有成就感,挺有意思,工作是辛苦的,结果却是快乐的.现在将这中快乐的的心情与大家分享一下.    真个项目用一颗主控搞定,ARM9的,200KBytes 片内RAM,主频可以跑到300MHz,64pin LQFP封装

nyxsec的专栏 3684

java深浅拷贝及hashmap1.8的源码分析

hashmap1.8的源码分析 类定义 public class HashMap&lt;K,V&gt; extends AbstractMap&lt;K,V&gt; implements Map&lt;K,V&gt;, Cloneable, Serializable 由图看出,hashmap1.8的主要优化是当发生多次哈希冲突时加入了红黑树 jav...

u011747152的博客 418

Python入门之机器学习(非常详细)篇幅拉满,一般人看不完!

什么是机器学习?监督学习 supervised learning;非监督学习 unsupervised learning;半监督学习 semi-supervised learning;强化学习 reinforcement learning;监督学习是不断向计算机提供数据(特征),并告诉计算机对应的值(标签),最后通过大量的数据,让计算机自己学会判断和识别。例如Google Photo,你在APP中输入狗,这时就会弹出与狗相关的图片,这背后使用的算法就是监督学习。

xiaolinyui的博客 2万+

Claude Code 的 Subagent 到底怎么用?

Subagent是ClaudeCode中的专业化AI代理系统,每个代理专注单一领域(如代码审查、数据库设计),具备独立记忆空间和并行处理能力。适用于中大型项目开发,通过配置文件定义代理职责与权限,可显式调用或自动触发多代理协作。典型场景包括代码安全审查、全栈并行开发和技术方案对比。使用时需注意避免过度拆分、权限过宽等陷阱,结合链式工作流和负载均衡可显著提升效率。实测在电商项目开发中能缩短20%工期并提升40%性能。

bgeyq的博客 1994

Python深拷贝(deep copy)与浅拷贝(shallow copy)的详解:子对象的概念

在Python中,“子对象”指的是对象内部包含的其他对象,通常是嵌套的数据结构

阿正的梦工坊 3368

关于solidworks无法获得下列许可SOLIDWORKS Standard的解决方法

在使用solid works的时候,出现无法获得下列许可SOLIDWORKS Standard,刚开始还以为软件出了问题,经过一方折腾找到了解决方法。希望这个方法可以帮助到您 找到这个服务 问题到这里就已经得到了解决,但更大的问题是,要是每次遇见这种都要这么麻烦,岂不是很累?这里也提供一种方法。考虑到每个人的情况,下面说的可能有一点啰嗦。 !!!!!!注意那个在此期间之后重新启动服...

Chaosna13的博客 7万+

从内存角度分析Java的深拷贝和浅拷贝

浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。举例来说更加清楚:对象A1中包含对B1的引用,B1中包含对C1的引用。浅拷贝A1得到A2,A2 中依然包含对B1的引用,B1中依然包含对C1的引用。深拷贝则是对浅拷贝的递归,深拷贝A1得到A2,A2中包含对B2(B1的copy)的引用,B2 中包含对C2(C1的copy)的引用。 接下来通过内存分析来说明深拷贝与浅拷贝的区别,由于本文主要关注两个拷贝

洲汐的博客 222

<PLC><socket><汇川>汇川PLC使用socket与其他控制器(如上位机)通讯模板程序示例

以上介绍了汇川PLC通用socket通讯的示例,事实上,汇川的官方手册也有使用示例,可以直接仿照使用,也可以加以修改。

用沸腾的热血,支付我们的人生吧! 3249

YOLO26优化:FPN涨点&轻量化篇 |多级特征融合金字塔(HS-FPN),助力小目标检测

高层筛选特征金字塔网络(HS-FPN),能够刷选出大小目标,增强模型表达不同尺度特征的能力,助力小目标检测

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 331

c++浅拷贝与深拷贝,从内存分析原理

深拷贝与浅拷贝的内存讲解

weixin_44115575的博客 704

如何在 Windows 中实时打开字幕

在 Windows 操作系统中,你可以使用编程来实现实时字幕功能,以便在屏幕上显示即时的文字内容。下面是一个示例代码,展示了如何使用Python编程语言在Windows上实现实时字幕功能。这样,字幕窗口将会不断地显示系统当前时间作为字幕。你可以根据自己的需求修改主循环中的内容,以显示你想要的实时字幕。希望以上代码和说明能够帮助你在Windows中实现实时字幕功能。函数创建了一个顶级窗口,并设置窗口的样式、位置和大小。方法,用于在字幕窗口中显示指定的字幕内容。上述代码中,我们使用了Python的。

DevWizard的博客 3270

JavaScript栈内存与堆内存 、浅拷贝与深拷贝

...

Aom_yt的博客 443

【四足机器人项目实战】四足机器人运动学、动力学模型

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、四足机器人实际模型的物理难点二、四足机器人运动学模型1.方法一:DH法建立运动学模型(1)运动学建模构型方法(2)运动学模型描述方法1、基于DH法四足机器人单腿运动学模型公式推导(0)DH法科普1)原理2)实现过程3)评价(1)四足机器人的建模规则、坐标系定义及实物参数确定1)标准Denavit-Hartenberg法建模规则2)单腿运动学模型坐标系定义示意图及简化模型3)

qq_35635374的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深拷贝浅拷贝(python内存机制)

深入了解参数传递的底层原理,需要理解一下“浅拷贝和深拷贝”,拷贝的内置函数为:copy(浅拷贝)、deepcopy(深拷贝)

m0_58680806的博客 703

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

javascript堆栈内存与深拷贝浅拷贝

js的堆栈问题

yw00yw的博客 452

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

浅拷贝和深拷贝_内存分析

浅拷贝和深拷贝_内存分析 copy(浅拷贝): 不拷贝子对象的内容,只是拷贝子对象的引用。 deepcopy(深拷贝): 会连子对象内容全部拷贝一份,对子对象的修改不会影响源对象。 测试浅拷贝: 在这里插入代码片 ...

Z_J_1997的博客 170

9. js的堆内存和栈内存、浅拷贝与深拷贝

一、js的堆内存和栈内存 在js引擎中对变量的存储主要有两种位置:堆内存和栈内存 1. 栈内存 主要用于存储各种基本类型的变量,包括Boolean、Number、String、Undefined、Null,以及对象变量的指针(每种类型的数据占用的内存空间的大小是确定的,并由系统自动分配和自动释放) 垃圾回收:方法一旦结束,栈中的局部变量立即销毁 但是堆中对象不一定销毁,因为可能有其他变量也指向了这个对象。 这时候栈内存给人的感觉就像一个线性排列的空间,每个小单元大小基本相等。 2. 堆内存 在

sunnnnh的博客 361

深拷贝和浅拷贝——画内存图理解

通过代码绘制内存图来理解深拷贝和浅拷贝 浅拷贝 //此时有一个obj1的对象 var obj1 = { name: 'lilei', age: 18, sex: 'nan', wife: { name: 'hanmeimei', age: 21 } } //现在将obj1的内容复制给obj2 var obj2 = {} for (var key in obj1) { obj2[k

qq_44176252的博客 452

JavaScript内存机制,浅拷贝和深拷贝

JavaScript内存机制 内存分配: JavaScript 在定义变量时就自动完成了内存分配 //给数值变量分配内存 var num = 123 //给字符串分配内存 var str = "abc" //给对象及其包含的值分配内存 var obj = { a: 1, b: null } //给数组及其包含的值分配内存(就像对象一样) var ary = [1, nu...

廊坊吴彦祖 466

细谈JS的存储方式(堆内存,栈内存)与深拷贝,浅拷贝

堆内存,栈内存 大家从一开始学习c/c++的时候对于声明变量就不陌生了,同样也是行文的重要部分,JavaScript也同样,出于JS引擎的独特设计,在分配内存空间时会自动处理不同类型的变量的存储位置,给程序员减轻一些负担,但是同时也加大了一些学习成本,今天我们就来细说一下。先贴定义: 栈内存:引擎执行代码时工作的内存空间,除了引擎,也用来保存基本值和引用类型值的地址 堆内存:用来保存一组无序且唯一的引用类型值,可以使用栈中的键名来取得 显而易见的,堆内存和栈内存在存储的任务上并不相.

BobbleHat的博客 731

Python 编程 深入了解内存管理机制、深拷贝与浅拷贝

Python 编程 深入了解内存管理机制、深拷贝与浅拷贝

叶庭云 成为自己的光 1307

python内存管理方式以及深拷贝,浅拷贝

简单开篇,手绘结尾 1.pip常用工具命令: $pip download packagename==version #下载指定版本模块,但是不安装 $pip freeze&gt;requirements.txt #将当前环境已有的模块重定向存入requirements.txt文件中 使用场景:一般环境移植时需要,比如需要在一台新的机器上执行当前的程序,但是程序可能需要依赖很多...

Jolting的博客 541

[C++]内存变化图解---深拷贝与浅拷贝的区别

每次学完深拷贝与浅拷贝,过一段时间总会忘记,

mmmm0584的博客 491
上一篇: C++【日期与时间工具】
下一篇: 【内存】引用计数解决浅拷贝问题,利用写时复制解决改变值的问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值