深浅拷贝以及解决浅拷贝(以string浅拷贝为例)

article/2025/10/12 10:51:26

一、什么是浅拷贝

        在类和对象的时候,其中编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定义类型是调用其拷贝构造函数完成拷贝的。

默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝

        浅拷贝:也称位拷贝/值拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共 享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以为还有效,所以当继续对资源进项操作时,就会发生发生了访问违规。

下面代码+图解释一下:

#include <iostream>using namespace std;namespace HK
{class string{public:string(const char* str = ""){_str = new char[strlen(str) + 1];strcpy(_str, str);}~string(){if (_str){delete[] _str;_str = nullptr;}}private:char* _str;};}int main()
{HK::string s1("hello");HK::string s2(s1);return 0;
}

上面代码中,在我自己的命名空间里面,string 类里面显示写了构造和析构,拷贝构造和赋值都没写,默认生成的对内置类型完成值拷贝,这里的 char* 就是内置类型。(int char short 等等常见的类型以及指针都是内置类型)

那么浅拷贝是什么样,如下图:

注意看,s2 拷贝 s1 地址都是一样的,析构的时候,s2 析构之后有没有发现 s1 的也被析构了?

因为 s2 和 s1 指向同一地址,如下图:

 

所以析构的时候,也会影响另一个。

那么怎么解决?

        可以采用深拷贝解决浅拷贝问题,即:每个对象都有一份独立的资源,不要和其他对象共享。

二、什么是深拷贝

        深拷贝∶给每个对象独立分配资源,保证多个对象之间不会因共享资源而造成多次释放造成程序奔溃问题。

下面代码+图解释:

#include <iostream>using namespace std;namespace HK
{class string{public:string(const char* str = ""){_str = new char[strlen(str) + 1];strcpy(_str, str);}string(const string& s): _str(new char[strlen(s._str) + 1]){strcpy(_str, s._str);}string& operator=(const string& s){if (this != &s){char* pStr = new char[strlen(s._str) + 1];strcpy(pStr, s._str);delete[] _str;_str = pStr;}return *this;}~string(){if (_str){delete[] _str;_str = nullptr;}}private:char* _str;};
}int main()
{HK::string s1("hello");HK::string s2(s1);HK::string s3("world");HK::string s4 = s3;return 0;
}

上面代码中,我显示写了拷贝和赋值,实现了深拷贝, 那么现在怎么样?如下:

 注意看上面的调试窗口, s2 拷贝之后的地址和 s1 是不一样的,s3 赋值给 s4,s4 和 s3 地址也是不一样的,下面截图出来,如下:

以上就是深浅拷贝。


http://chatgpt.dhexx.cn/article/Cy5Lq6B4.shtml

相关文章

ctf之培根密码

根据特征怀疑是培根密码 flag{AAAABAAAAAAAABAABBBAABBABABAAABAABAAAABBAABAAABABBABAAAAAABAABAAAABBBABABAABAABA} 直接在线解密 https://tool.bugku.com/peigen/ flag{BACONISDELICIOUS}

培根密码加解密

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01; 0x00 介绍 培根密码实际上就是一种替换密…

培根密码解密脚本

官方吐槽&#xff1a;疫情复发难受&#xff0c;什么时候是个头 #!/usr/bin/env python3 # -*- coding:utf-8 -*- #Author&#xff1a;later_future import string miweninput("请输入密文&#xff1a;") count0 msg"" flag"" #培根加密百度百科…

攻防世界crypto部分sherlock的writeup,原来不是培根密码。

下载附件后&#xff0c;发现是一个很大的文本&#xff0c;搜了下flag没啥收获。 1、后来看到下面这个 2、明显的故意大写&#xff0c;难道是培根密码&#xff1f;这就有思路了&#xff0c;将大写过滤出来&#xff1a; cat f590c0f99c014b01a5ab8b611b46c57c.txt | grep -Eo […

培根密码加解密(Python)

原理 加密时&#xff0c;明文中的每个字母会根据下面转换成5个字母&#xff1b; 解密时&#xff0c;密文中的每5个字母为一组转换成对应的1个字母&#xff1b; Python代码如下&#xff1a; CODE_TABLE { #培根字典aaaaa:a,aaaab:b,aaaba:c,aaabb:d,aabaa:e,aabab:f,aabba:…

CTF密码学-加解密总结

零基础学黑客&#xff0c;搜索公众号&#xff1a;白帽子左一密码学基本简介 密码学&#xff08;在西欧语文中&#xff0c;源于希腊语krypts“隐藏的”&#xff0c;和grphein“书写”&#xff09;是研究如何隐密地传递信息的学科。 在现代特别指对信息以及其传输的数学性研究&…

密码及编码

1. 密码 古典密码学 凯撒密码(Caeser)&#xff1a;位移密码 特殊形式&#xff08;加解密相同&#xff0c;因为26个字母是循环的&#xff09;&#xff1a;ROT13 栅栏密码&#xff1a;分组密码。 弗吉尼亚 现代密码学 对称加密算法&#xff1a;使用加密用过的秘钥及相同算法的…

CTF-密码学-培根密码

题目&#xff1a;bacon bAcon iS a MEaT prodUcT prePared frOm a pig and UsuALLy cUReD. 读题&#xff1a;翻译过来意思是培根 审题&#xff1a;联想到培根密码 解题&#xff1a;培根密码就是大写变A小写变B import string timu"bAcon iS a MEaT prodUcT prePared frOm…

【无标题】简单的培根密码解密

第一题 题目AABBBAABAAABABAABABAABBAB BABAAABBABBAAAAAAABB 此题由大写字母AB组成&#xff0c;不难看出这可以用培根密码转换器进行解密得出flag 解密得出flag&#xff5b;HELLO WORD&#xff5d;

CTF-Show密码学【摩斯码、培根密码】

萌新 密码33 一、题目信息 题目名称&#xff1a;我想吃培根题目描述&#xff1a;-- — .-. … . …–.- … … …–.- -.-. — — .-… …–.- -… …- - …–.- -… .- -.-. — -. …–.- … … …–.- -.-. — — .-… . .-. …–.- – – -… -… – -… – -… – – – -…

CTF-培根密码

CTF学习上的一些疑点和解疑 主题&#xff1a;培根密码的随意性 反正我是觉得挺离谱的 序章 CTF学习上的一些疑点和解疑前言&#xff1a;培根小贴士一、培根密码是什么&#xff1f;二、解答1.题目2.解密顺序 总结还没听懂的我给大家展现一些例子&#xff1a; 前言&#xff1a;…

密码学笔记——培根密码

培根密码,培根所用的密码是一种本质上用二进制数设计的,没有用通常的0和1来表示,而是采用a和b 一、培根密码加密方式 第一种方式: A aaaaa B aaaab C aaaba D aaabb E aabaa F aabab G aabba H aabbb I abaaa J abaab K ababa L ababb M abbaa N abbab O abbba P abb…

培根密码(Bacon)——python解密

简介 培根密码&#xff0c;又名倍康尼密码&#xff08;英语&#xff1a;Bacon’s cipher&#xff09;是由法兰西斯培根发明的一种隐写术。 特点&#xff1a; 培根密码本质上是将二进制信息通过样式的区别&#xff0c;加在了正常书写之上。培根密码所包含的信息可以和用于承载…

CTF-bacon(培根密码)

一、题目 培根密码实际上就是一种替换密码&#xff0c;根据所给表一一对应转换即可加密解密 。它的特殊之处在于&#xff1a;可以通过不明显的特征来隐藏密码信息&#xff0c;比如大小写、正斜体等&#xff0c;只要两个不同的属性&#xff0c;密码即可隐藏。 二、解题思路 …

【密码学 | CTF】培根密码

原理简述 加密方式有两种&#xff0c;但说实话我没看懂第二种的&#xff1b;i-j和u-v是怎么加密的呢&#xff1f;一解密岂不是乱了&#xff1f; 但解密用第一种方式就行了&#xff0c;每五个切割&#xff0c;对照字典解密即可&#xff0c;难度很小 def 培根密码_解密():培根密…

XML文档操作

文章目录 [toc] XML概述代码示例 CSS格式化XML为什么要用CSS样式表&#xff1a; 代码示例&#xff1a;代码详解&#xff1a; XSLT转化XMLXSLT简介&#xff1a;代码示例代码详解&#xff1a;正确的样式表声明从XML里提取数据节点匹配 DOM解析XMLXML DOM简介节点 代码示例代码详解…

XML文件的DOCTYPE定义

2019独角兽企业重金招聘Python工程师标准>>> DOCTYPE的常用声明&#xff1a;按照 HTML 4.01 XHTML 1.0 XHTML 1.1 列表如下&#xff0c;错误的DOCTYPE HTML PUBLIC反而会导致页面解析错误。HTML 4.01规范分为&#xff1a;Strict, Transitional, Frameset <!DO…

XML的内容

XML简介&#xff1a; XML是跨平台的语言&#xff0c;它不需要安装任何环境的语言&#xff0c; 它是所有语言所共有的&#xff0c;单独的语言&#xff0c;并且不是所有语言内部的。 它是让所有语言去和xml交互 。 注意&#xff1a; html前身是xml <></>&#xff0…

xml的介绍、xml的示例文件、xml语法介绍

xml的介绍 xml是可扩展的标记性语言 xml的主要作用&#xff1a; 1.用来保存数据&#xff0c;而且这些数据具有自我描述性 2.它可以作为项目或者模块的配置文件 3.还可以做网络传输的格式(现在以JSON为主) xml的示例文件 先创建一个文件 文件命名为xxx.xml 在xml文件中书写内…

XML文件简介

XML基本概念 单独的数据,它的含义很模糊。所以数据+含义,适用于传输数据,而不是显示数据(HTML)XML(eXtensible Markup Language),可扩展标记语言:意义+数据标签可自定义,具有自描述性纯文本文件,跨系统/平台/语言W3C标准(1998年,发布XML1.0,包括几乎所以的Unicode…