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

在这里插入图片描述

浅拷贝和深拷贝

1.浅拷贝

浅拷贝,多个指针指向同一段内存,出现一处指针修改数据,其它指针的数据也发生改变。

1.1 面向过程的浅拷贝(C方式)

如下代码:

//下面程序,从键盘获取4个字符串,然后输出到屏幕
int main()
{
    char buf[100];
    char* strArr[4];//长度为4的字符指针数组,分别指向4个字符串
    for (int i = 0; i <4 ; i++)//从键盘获取4个字符串
    {
        cin >> buf;
        strArr[i] = buf;
    }

    for (int i = 0; i < 4; i++)//把4个字符串输出到屏幕
        cout << strArr[i] << " ";

    return 0;
}

在键盘中输入4个单词:Apple Banana Orange Peach
但是输出的结果却是:Peach Peach Peach Peach
原因如下:
在这里插入图片描述
假设buf的地址为200。第一次从键盘读取Apple,并把200这个地址赋值给strArr[0]。
第二次从键盘读取Banana,并把200这个地址赋值给strArr[1],注意这个地方的问题,由于buf这段内存只有一个,第二次赋值会把第一次的Apple覆盖。
第三次从键盘读取Orange,并把200这个地址赋值给strArr[2],但这时Orange把前面的输入覆盖了。
第四次从键盘读取Pear,并把200这个地址赋值给strArr[3]。但这是Pear把前面的输入覆盖了。
最后输出时strArr[0]到strArr[3]都去地址200处取字符串,就全部都是"Pear"。
这是一个典型的浅拷贝,多个指针指向同一段内存造成的。

1.2 面向对象的浅拷贝(类)

下面是一个有问题的类(StringBad类的简化版),只是为了演示浅拷贝的问题

**class CStr
{
private:
char* str;//字符串指针
public:
CStr(const char* s)//构造函数,通过s构造一个CStr类对象
{
    str = new char[strlen(s) + 1];//动态创建内存
    strcpy(str,s);//把s的内容复制到str
}
void set(const char* s)//修改字符串的值
{
    delete[]str;//释放原来的内存
    str = new char[strlen(s) + 1];//动态创建内存
    strcpy(str, s);//把s的内容复制到str
}
void show()const
{
    cout << str << endl;
}
};

int main()
{
    CStr s1{"趣字节,有趣的编程"};
    s1.show();//输出s1的内容

    CStr s2 = s1; //把s1赋值给s2
    s2.show();//输出s2的内容

    s2.set("好好学习,天天向上");//修改s2的值
    s2.show();//输出s2的内容
    s1.show();//再输出s1的内容

    return 0;
}

第25行,创建一个对象s1,并初始化为"趣字节,有趣的编程";
第28行,创建另一个对象s2,并把s1赋值给s2;
第29行,输出s2的内容,这是是s1赋值的值,这是正确的;
第31行,修改s2的内容,将其改为"好好学习,天天向上";
第32行,输出s2的内容,是修改后的值"好好学习,天天向上",这是正确的;
第33行,输出s1的值,应该是"趣字节,有趣的编程",但实际输出的却是"好好学习,天天向上",这是错误的。
错误的原因也是浅拷贝造成的,具体原因如下图:

在这里插入图片描述

2.深拷贝

深拷贝,即为每个指针创建一个单独的内存,然后再复制数据。

2.1 面向过程的深拷贝

把前面的浅拷贝程序进行适当的修改,如下:


#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

//深拷贝
//下面程序,从键盘获取4个字符串,然后输出到屏幕
int main()
{
    char buf[100];
    char* strArr[4];//长度为4的字符指针数组,分别指向4个字符串
    for (int i = 0; i < 4; i++)//从键盘获取4个字符串
        {
            cin >> buf;
            //strArr[i] = buf;//这是浅拷贝
            //下面的是深拷贝
            strArr[i] = (char*)malloc(strlen(buf) + 1);//1.创建单独的内存
            strcpy(strArr[i],buf);//2.复制数据
        }

    for (int i = 0; i < 4; i++)//把4个字符串输出到屏幕
        cout << strArr[i] << " ";

    //最后需要释放动态内存
    for (int i = 0; i < 4; i++)
        free(strArr[i]);
    return 0;
}

从上面的程序能够正常的输出。
第12行,为每个字符串创建单独的内存,用于存放数据。
第13行,将数据从buf复制到新创建的内存。
第20,21行,释放每个字符串单独创建的内存,否则出现内存泄漏。


本篇完!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/554238.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity面向切面编程

一直说面向AOP&#xff08;切面&#xff09;编程&#xff0c;好久直接专门扒出理论、代码学习过。最近因为某些原因&#x1f62d;还得再学学造火箭的技术。 废话不多说&#xff0c;啥是AOP呢&#xff1f;这里我就不班门弄斧了&#xff0c;网上资料一大堆&#xff0c;解释的肯定…

广东海洋大学成功部署(泰迪智能科技)大数据人工智能实验室建设

广东海洋大学简称广东海大&#xff0c;坐落于广东省湛江市&#xff0c;是国家海洋局与广东省人民政府共建的省属重点建设大学、广东省高水平大学重点学科建设高校、粤港澳高校联盟成员 &#xff0c;入选卓越农林人才教育培养计划&#xff0c;是教育部本科教学水平评估优秀院校。…

【SQL】数据库SQL语句

1、主键 主键值唯一&#xff0c;不可修改&#xff0c;不能为空&#xff0c;删除不能重用 2、数据类型&#xff08;常用&#xff09; char int float date timestamp 3、select select * from data; select xx,xxx from data;//取部分行 select * from data limit 100; //限…

msyql中的四大日志

日志 错误日志二进制日志作用日志格式日志查看日志删除 查询日志慢查询日志 错误日志 错误日志是MySQL中最重要的日志之一&#xff0c;它记录了当MySQL启动和停止时&#xff0c;以及服务器子啊运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时…

angular node版本问题导致运行出错时应该怎么处理

如下图所示&#xff1a; 处理方式如下&#xff1a; package.json中start跟build中添加&#xff1a;SET NODE_OPTIONS--openssl-legacy-provider即可

SSRF+Redis未授权getshell

SSRFRedis未授权getshell 1.前言 当一个网站具有ssrf漏洞&#xff0c;如果没有一些过滤措施&#xff0c;比如没过滤file协议&#xff0c;gophere协议&#xff0c;dict等协议&#xff0c;就会导致无法访问的内网服务器信息泄露&#xff0c;甚至可以让攻击者拿下内网服务器权限 …

pixhawk控制板的ArduPilot固件编译

0. 环境 - ubuntu18&#xff08;依赖python2和pip&#xff0c;建议直接ubuntu18不用最新的&#xff09; - pixhawk 2.4.8 - pixhawk 4 1. 获取源码 # 安装git sudo apt install git # 获取源码 cd ~/work git clone --recurse-submodules https://github.com/ArduPilot/a…

腾讯AI Lab:“自我对抗”提升大模型的推理能力

本文介绍了一种名为“对抗性禁忌”&#xff08;Adversarial Taboo&#xff09;的双人对抗语言游戏&#xff0c;用于通过自我对弈提升大型语言模型的推理能力。 &#x1f449; 具体的流程 1️⃣ 游戏设计&#xff1a;在这个游戏中&#xff0c;有两个角色&#xff1a;攻击者和防守…

VsCode调试远程服务器上面的Docker容器

第一步 VsCode 连接ssh 下载安装VsCode(Visual Studio Code)&#xff0c;首次安装会提示你安装Chinese(Simplified)中文简体&#xff0c;安装完后重新打开就是汉化界面了。在左边侧边栏找到扩展选项&#xff0c;然后安装Remote Development插件&#xff0c;里面包含了Remote S…

糖尿病可能是一团虚火,肝肾同源,肝阴不足。

其实对于很多的糖尿病患者来说&#xff0c;他的问题本质可能是一团虚火&#xff0c;就拿前段时间我的门诊一个患者为例&#xff0c;之前患有高血压&#xff0c;总是眩晕烦躁&#xff0c;常常失眠&#xff0c;大概近四个月出现多饮、多尿怎么喝水也不解渴&#xff0c;经过检查确…

每日一题---OJ题: 链表的回文结构

片头 嗨! 小伙伴们,大家好! 今天我们来一起学习这道OJ题--- 链表的回文结构 嗯...这道题好像不是很难,我们来分析分析 举个例子: 我们可以看到,上图中的两个链表都是回文结构: 即链表的回文结构是指一个链表中的结点值从前往后读和从后往前读都是一样的结构。也就是说&#xf…

春秋云境:CVE-2022-32991[漏洞复现]

从CVE官网查询该漏洞相关信息 该漏洞是由于welcome.php中的eid参数包含了SQL注入漏洞 则我们的目标就在于寻找welcome.php地址以及相关的可注入eid参数 开启靶机 先在页面正常注册、登录一个账号。密码随便填 进入了home目录&#xff0c;这里有三个话题可以选择开启 随便选…

word批量修改表格样式

利用宏&#xff0c;批量选中表格&#xff0c;然后利用段落和表设计来操作。 利用宏&#xff0c;批量选中表格&#xff0c;参考百度安全验证段落&#xff0c;表格里面的内容有空格&#xff0c;应该是有缩进&#xff0c;在段落中去掉缩进&#xff0c;即缩进-特殊&#xff0c;选择…

Next.js 14 App Router引入 farmer-motion 初始化异常解决,顺带学点知识

前言 farmer-motion 是一个非常好用的动画库&#xff0c;当然用来做组件切换和路由切换过渡更不在话下。 记录一下&#xff0c;Next.js 14 App Router 下引入初始化异常的解决姿势&#xff0c;顺带扯一下 next.js 的知识点&#xff1b; 问题 过渡组件代码 我们拿 farmer-m…

https证书是什么,怎么申请

https证书的名称有很多&#xff0c;其本名是SSL/TLS数字证书&#xff0c;本意是实现https访问的证书&#xff0c;故而很多人会称之为https证书&#xff0c;又因为其需要部署于域名服务器之上&#xff0c;所以也有人称之为域名证书。 所以https证书又名SSL证书、域名证书等。 h…

SPN的相关利用(上)

什么是SPN 服务主体名称(SPN)是服务实例&#xff0c;可以理解为一个服务&#xff0c;比如mssql,http等等的唯一标识符。如果在整个林或域中的计算机上安装多个服务实例&#xff0c;则每个实例都必须具有自己的 SPN&#xff0c;Kerberos 身份验证使用 SPN 将服务实例与服务登录…

深入理解 pytest Fixture 方法及其应用

当涉及到编写自动化测试时&#xff0c;测试框架和工具的选择对于测试用例的设计和执行非常重要。在Python 中&#xff0c;pytest是一种广泛使用的测试框架&#xff0c;它提供了丰富的功能和灵活的扩展性。其中一个很有用的功 能是fixture方法&#xff0c;它允许我们初始化测试环…

Eland上传bge-large-zh-v1.5向量化模型到ElasticSearch中

最近需要做一些向量检索&#xff0c;试试ES 一、准备 系统&#xff1a;MacOS 14.3.1 ElasticSearch&#xff1a;8.13.2 Kibana&#xff1a;8.13.2 本地单机环境&#xff0c;无集群&#xff0c;也不基于Docker BGE是一个常见的文本转向量的模型&#xff0c;在很多大模型RAG应…

Objective-C网络数据捕获:使用MWFeedParser库下载Stack Overflow示例

概述 Objective-C开发中&#xff0c;网络数据捕获是一项常见而关键的任务&#xff0c;特别是在处理像RSS源这样的实时网络数据流时。MWFeedParser库作为一个优秀的解析工具&#xff0c;提供了简洁而强大的解决方案。本文将深入介绍如何利用MWFeedParser库&#xff0c;以高效、…

【Linux系统编程】第五弹---基本指令(三)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、grep指令 2、zip/unzip指令 3、tar指令 4、bc指令 5、uname指令 6、重要的几个热键 7、拓展指令 总结 1、grep指令 …