C++知识点12:深拷贝浅拷贝

C++深入理解:深拷贝和浅拷贝 C++面试题 阅读详情
原

C++(笔记)深浅拷贝and何时调用

一、何时调用拷贝函数

  • 何时会调用拷贝函数?
    1、对象在创建时使用其他的对象初始化
    Person p(q); //此时复制构造函数被用来创建实例p
    Person p = q; //此时复制构造函数被用来在定义实例p时初始化p

2、对象作为函数的参数进行值传递时

f(p); //此时p作为函数的参数进行值传递,p入栈时会调用复制构造函数创建一个局部对象,与函数内的局部变量具有相同的作用域

需要注意的是,赋值并不会调用复制构造函数,赋值只是赋值运算符(重载)在起作用

p = q; //此时没有复制构造函数的调用! (记住初始化和赋值的区别)

简单来记的话就是,如果对象在声明的同时将另一个已存在的对象赋给它,就会调用复制构造函数;如果对象已经存在,然后将另一个已存在的对象赋给它,调用的就是赋值运算符(重载)


二、深浅拷贝解析

1、两者区别

1.在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数–即浅拷贝,它能够完成成员的一对一拷贝(逐位复制),当类中数据成员没有指针时,利用浅拷贝完全没问题的;但当数据成员中有指针时,如果采用简单的浅拷贝,那么两个类中的两个指针将会指向同一块地址,当对象快结束时,会调用两次析构器,从而导致指针悬挂现象,所以此时必须使用深拷贝
2.简单来说,带指针用深拷贝,不带指针用浅拷贝

2、用图来解释什么是深浅拷贝

1.无指针的浅拷贝
这里写图片描述

2.有指针的浅拷贝
这里写图片描述

3.有指针的深拷贝
 这里写图片描述

3、用代码解释深浅拷贝

1.无指针的浅拷贝

class A
{
    public:
        A(int _data):data(_data){}
        A(){}
    private:
        int data;   
};

int main()
{
    A a(5);
    A b=a;//浅拷贝 
}
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

解释:b=a;就是浅拷贝,执行完b.data=5;如果对象中没有其他资源(如:堆,文件,系统资源),深浅无差。

2.有指针的浅拷贝(导致内存泄露)

class A
{
    public:
        A(int _size):size(_size)
        {
            data=new int[size];
        }//给data分配size个内存 
        A(){}
        ~A()
        {
            delete []data;
        }//析构时释放资源 
    private:
        int *data;
        int size;   
};

int main()
{
    A a(5);
    A b=a;
}
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 这里b=a会造成未定义行为,因为类A中拷贝构造器是编译器生成的,所以b=a执行的是浅拷贝(记住:浅拷贝是对象数据之间的简单赋值)例如:b.size=a.size和b.data=a.data
  • 这里b的指针data和a的指针指向了堆上的同一块内存,a和b析构时同一块内存将会被释放两次,其结果是,有未定义的内存将会被泄露或程序奔溃!!!

3.有指针的深拷贝,(解决上面的问题)对象另开辟一块内存

class A
{
    public:
        A(int _size):size(_size)
        {
            data=new int[size];
        }//给data分配size个内存 
        A(){}
        A(const A&_A):size(_A.size)
        {
            data=new int[size];
        }//深拷贝 
        ~A()
        {
            delete []data;
        }//析构时释放资源 
    private:
        int *data;
        int size;   
};

int main()
{
    A a(5);
    A b=a;
}
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

**以上代码就没有问题了,与浅拷贝区别就是,在自己定义的拷贝函数里另开辟一块内存即深拷贝,

扫码向博主提问

浅然_

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • Java
  • MySQL
    <div class="article-bar-bottom">
            <div class="article-copyright">
        版权声明:本文为博主原创文章,转载请注明出处  浅然的专栏           https://blog.youkuaiyun.com/w_linux/article/details/65450857      </div>
                    <div class="tags-box artic-tag-box">
        <span class="label">文章标签:</span>
                    <a class="tag-link" href="http://so.youkuaiyun.com/so/search/s.do?q=C++&amp;t=blog" target="_blank">C++                       </a><a class="tag-link" href="http://so.youkuaiyun.com/so/search/s.do?q=深拷贝浅拷贝&amp;t=blog" target="_blank">深拷贝浅拷贝                     </a><a class="tag-link" href="http://so.youkuaiyun.com/so/search/s.do?q=类&amp;t=blog" target="_blank">类                       </a>
    </div>
                    <div class="tags-box">
        <span class="label">个人分类:</span>
                    <a class="tag-link" href="https://blog.youkuaiyun.com/w_linux/article/category/6701432" target="_blank">【C/C++】                       </a>
    </div>
                    <div class="tags-box">
        <span class="label">所属专栏:</span>
                    <a class="tag-link" href="https://blog.youkuaiyun.com/column/details/15238.html" target="_blank">C++阅读笔记</a>

    </div>
                    <div class="tags-box hot-word">
        <span class="label">相关热词:</span>
                    <a class="tag-link" href="https://blog.youkuaiyun.com/better_xiaoxuan/article/details/52957219" target="_blank">
        c++::           </a>
                    <a class="tag-link" href="https://blog.youkuaiyun.com/k_koris/article/details/80469956" target="_blank">
        ->和c++          </a>
                    <a class="tag-link" href="https://blog.youkuaiyun.com/a7055117a/article/details/48348821" target="_blank">
        c++汉诺塔          </a>
                    <a class="tag-link" href="https://blog.youkuaiyun.com/jx232515/article/details/51547372" target="_blank">
        c++冒泡排序         </a>
                    <a class="tag-link" href="https://blog.youkuaiyun.com/qq_36221862/article/details/61413619" target="_blank">
        c++纯虚函数         </a>
                </div>
        </div>

<!-- !empty($pre_next_article[0]) -->
        <div class="related-article related-article-prev text-truncate">
    <a href="https://blog.youkuaiyun.com/w_linux/article/details/65445143">
        <span>上一篇</span>CSS三种创建和六种选择器       </a>
</div>
            <div class="related-article related-article-next text-truncate">
    <a href="https://blog.youkuaiyun.com/w_linux/article/details/65455396">
        <span>下一篇</span>C++(笔记)深浅拷贝and静态static基础练习      </a>
</div>
</div>
从投影到抗噪:直线拟合三大算法实战指南 本文深入解析了直线拟合的三大核心算法:常规最小二乘法(OLS)、正交回归(TLS)和RANSAC。通过对比其几何原理、代码实现与适用场景,为计算机视觉和数据分析领域的实践者提供了清晰的选型指南,帮助在抗噪、旋转不变性等不同需求下,精准选择并应用最合适的算法。 阅读详情

相关推荐

stata:stata软件教程(人大十八讲)(1) 第一章 stata入门

第一章 stata入门1.1 安装1.2 启用和退出1.3 打开和查看数据1.4 寻求帮助与网络资源1.5 命令示例1.6 几个环境设置1.7 复习与练习1.8 附录 注:教材为:Stata 统计分析教程 stata软件教程(人大十八讲) 中国人民大学出版社 陈传波 1.1 安装 1.2 启用和退出 1.3 打开和查看数据 1.4 寻求帮助与网络资源 1.5 命令示例 1.6 几个环境设置 1.7 复习与练习 1.8 附录 ...

qq_47805483的博客 1万+

C++(笔记)深浅拷贝and何时调用

一、何时调用拷贝函数 何时会调用拷贝函数? 1、对象在创建时使用其他的对象初始化 Person p(q); //此时复制构造函数被用来创建实例p Person p = q; //此时复制构造函数被用来在定义实例p时初始化p 2、对象作为函数的参数进行值传递时 f(p); //此时p作为函数的参数进行值传递,p入栈时会调用复制构造函数创建一个局部对

浅然的专栏 2273

新手必看:TwinCAT死活扫不到倍福CX5020?别慌,先检查这3个地方(附静态IP配置)

本文详细介绍了TwinCAT软件无法扫描到倍福CX5020控制器的常见问题及解决方案。从网络连通性检查、系统环境配置到静态IP设置,提供了一套完整的排查流程和优化建议,帮助新手快速解决通信问题,确保设备稳定运行。

weixin_27219587的博客 364

[STL]深拷贝和浅拷贝问题(内存泄露+内存未释放+调用拷贝构造的五种情况)

通过三段代码详细解释浅拷贝和深拷贝带来的问题和解决方案,例如`内存泄露` or `内存未释放`。明确重载拷贝构造函数的重要性,以及出现拷贝构造函数的几种情况。

weixin_44972997的博客 3782

微信群消息监控系统实战:从零搭建Python自动化监控平台

本文详细介绍了如何从零搭建Python微信群消息监控系统,实现自动化监控和记录群消息。通过wxauto库模拟人工操作微信,结合MySQL数据库存储和智能去重策略,系统能高效处理大量消息并支持关键词监控。文章还分享了性能优化、安全合规等实战经验,帮助开发者快速构建高效稳定的监控平台。

weixin_29091105的博客 320

哈工大2021年秋季学期数据结构期末试题

因为考完试没有收演草纸,所以题中数据与考试差距不大。选项顺序可能略有差异;选择第5题希尔排序的序列数据是后编的;简答第3题B-树的插入序列顺序可能不同,但是考察的点是一样的。其他题的数据基本可以保证和原题一样。 一、选择题 111.以下代码的时间复杂度是 for(int k=1;k<=n;k++) for(int j=1;j<=n;j++) count++; A.O(n)       B.O(nlogn) &

Castria的博客 4272

c++基础知识:深拷贝与浅拷贝

深拷贝与浅拷贝

qq_48335434的博客 1158

海量数据 / Vastbase 深度研究笔记 v3.1

v3.1 重点修订:在 v3.0 审慎版基础上,新增“2026 新变量”章节,纳入 7 亿级定增、HTAP / 多模态时序数据库、G100 V3.0 Build 8 的 3CM+2DN 高可用补强、pgvector / V100 / AI 多模叙事,以及集成服务基因与标准软件 ARR 的拉扯。核心关注点是:Vastbase 能否把 openGauss 生态红利、数据库产品矩阵和行业交付能力,转化为可持续、可复购、低边际成本的标准软件收入。海量不是没有业务基本盘,也不是马上失血致死;客户越多,服务债越大。

喝醉酒的小白 556

C++学习(3)——拷贝构造函数以及对象的使用(this指针)

拷贝(复制)构造函数、深拷贝和浅拷贝、this指针、static(静态)数据成员、普通对象数组和指针对象数组、const对象

似末的博客 1551

YOLOv11+SAHI实战:5步搞定无人机航拍小目标检测(附VisDrone数据集调参技巧)

本文详细介绍了如何结合YOLOv11目标检测框架与SAHI切片推理技术,高效解决无人机航拍图像中的小目标检测难题。通过VisDrone数据集调参技巧和5步实战指南,帮助开发者快速构建高性能检测系统,显著提升小目标检测的准确率和效率。

rum55的博客 190

CQE和SQE 以及 PQA和DQA的区别

‌:PQA聚焦产品全生命周期流程管理,DQA专注于设计阶段的质量控制。

a1809032425的博客 1904

C++类和对象——深拷贝和浅拷贝

一般情况下浅拷贝没有任何副作用,但是当类中有指针,并且指针指向动态分配的内存空间,将会导致两个对象的指针变量指向同一块内存空间,当对象被销毁的时候调用析构函数,因为在析构函数中会释放指针所指向的堆空间,造成同一块堆空间被释放两次从而导致程序运行出错。两个对象中的指针变量不会指向同一块内存空间,然后再将右值对象指针所指向的空间的内容拷贝到新的对象向指针当中所指向的堆空间中。同一类型的对象之间可以赋值,使得两个对象的成员变量的值相等,两个对象仍然是两个对立的对象,这种情况叫做浅拷贝。提出的第一个问题的)。

ttdffmm的博客 470

【大模型工程局】告别单打独斗:手把手带你构建多智能体系统(MetaGPT 启示录)

想象一下,不再是只有一个全知全能的 AI,而是有一群各有所长、能够独立思考和行动的“智能体”(Agent)。它们生活在一个共同的环境中,可以相互交流、协作完成共同目标,也可能为了有限资源而相互竞争。这就是多智能体系统(MAS)的核心图景。MAS 的关键特征:自治性 (Autonomy):每个智能体都能独立感知环境、做出决策并执行动作,无需外部直接控制。交互性 (Interaction):智能体之间可以通过某种通信机制(显式或隐式)交换信息、协调行为。

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1184

【c++中的浅拷贝与深拷贝学习】

​ 总的来说,如果一个类中的成员只包含普通的成员,使用复制运算符,copy函数时,这时浅拷贝等价于深拷贝。但是当类对象中含有指针类型的成员变量时,就需要注意重新设计拷贝构造函数,复制时应该为指针成员重新开辟内存空间,之后复制内容,实现深拷贝。

ygxdxm的博客 1904

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【C++】浅拷贝与深拷贝

本篇文章介绍了string类中深拷贝、浅拷贝,以及如何实现的相关知识,欢迎大家评论交流!

2402_82689232的博客 1937

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++中浅拷贝和深拷贝

本文介绍了C++中浅拷贝和深拷贝的概念及使用场景。浅拷贝(如cv::Rect)仅复制对象表层数据(指针地址),效率高但共享内存;深拷贝(如.clone())会复制底层数据,独立安全但资源消耗较大。在代码示例中,先用浅拷贝快速截取子矩阵,再通过深拷贝存储独立数据,兼顾效率与安全性。浅拷贝适合临时访问,深拷贝适合长期保存和修改数据。

一个搬运知识的笨小孩 907

VC中sqlite的使用

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

类的深拷贝与浅拷贝

C++中类的深拷贝和浅拷贝

明朗晨光的专栏 1171

C++ 中的深拷贝与浅拷贝

  浅拷贝:又称值拷贝,将源对象的值拷贝到目标对象中去,本质上来说源对象和目标对象共用一份实体,只是所引用的变量名不同,地址其实还是相同的。举个简单的例子,你的小名叫西西,大名叫冬冬,当别人叫你西西或者冬冬的时候你都会答应,这两个名字虽然不相同,但是都指的是你。   假设有一个String类,String s1;String s2(s1);在进行拷贝构造的时候将对象s1里的值全部拷贝到对象s2里...

weixin_30682127的博客 444

关于c++深拷贝与浅拷贝

首先看一段代码: 1 #include<iostream> 2 #include<cstring> 3 #include<malloc.h> 4 using namespace std; 5 6 class Teacher{ 7 public: 8 Teacher(int id,char *name){ 9 ...

weixin_30535913的博客 104

C++ 浅拷贝与深拷贝探究

C++浅拷贝与深拷贝探究 浅拷贝与深拷贝的概念是在类的复制/拷贝构造函数中出现的。 拷贝构造函数使用场景 对象作为参数,以值传递方式传入函数(要调用拷贝构造函数将实参拷贝给函数栈中的形参) 对象作为返回值,以值方式返回(要调用拷贝构造函数,将要传出的对象拷贝给一个外作用域的临时对象) 用一个对象去初始化另外一个对象 浅拷贝:直接使用 “=” 赋值,拷贝给定对象属性。(如果是...

yocichen 146

C++ 浅拷贝和深拷贝

拷贝构造函数默认的是浅拷贝。当不涉及到堆内存时用浅拷贝完全可以,否则就需要深拷贝了。 浅拷贝相当于一个箱子有多个钥匙,但其中一个人打开箱子取走箱子里的东西时,其他人是不知道的。 深拷贝是有多个箱子每个箱子对应一个钥匙,但一个人取走他的钥匙对应的箱子里的东西时,不会对其他人产生影响。 1 #include <bits/stdc++.h> 2 3 using n...

weixin_30483013的博客 224

C++-Record21—浅拷贝及深拷贝问题

浅拷贝造成的影响

恋蛩音的博客 232

C++--浅拷贝和深拷贝

C++--浅拷贝和深拷贝

学无止境 464

C++的深拷贝与浅拷贝

对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=88; int b=a;  而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。        1 2 3 4 5 6 7 8 9 10 11

lpp0900320123的专栏 4万+

在C++中深拷贝和浅拷贝的基本用法

首先,什么是浅拷贝?什么是深拷贝? 浅拷贝:在C++中,在用一个对象时,只是复制了成员,并没有复制资源,使两个对象同时指向了同一资源的复制方式称为浅拷贝;(简单的来说就是成员数据间的赋值—数据拷贝) 深拷贝:是指向内容复制到当前对象新分配的缓存缓冲区中的一种复制方式。(—地址拷贝) 我们在学习编程语言过程中常见的拷贝方式如下这种,这是简单的普通对象拷贝: int a=12; int b=a

番茄都是西红柿 527

浅析C++中深拷贝与浅拷贝

浅析C++的深拷贝与浅拷贝

x1722618772的博客 594
上一篇: C++知识点11:内联函数 / 内联函数和宏define的区别
下一篇: C++知识点12:继承和组合
有多少个小土豆
博客等级 码龄10年 235粉丝 210原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值