当前位置:首页 > 技术 > 正文内容

C++浅拷贝深拷贝

Lotus2022-10-06 19:05技术

1. C++ 浅拷贝

什么是浅拷贝?

一般比较形象的理解,浅拷贝可以理解"值"层面的拷贝,深拷贝可以理解成"内存"上的拷贝,特别是类里面含有指针类型的。

// .h文件
class HasPtrMem
{
public:
HasPtrMem();
HasPtrMem(const HasPtrMem& h);
~HasPtrMem();

void print();
int *p;
};
// .cpp 文件
HasPtrMem::HasPtrMem() : p(new int(0))
{
cout << "HasPtrMem()" << endl;
}

void HasPtrMem::print()
{
cout << *p << endl;
}

HasPtrMem::HasPtrMem(const HasPtrMem& h)
{
*p = *h.p;
}
HasPtrMem::~HasPtrMem()
{
delete p;
}
// main.cpp
HasPtrMem a;
HasPtrMem b(a)
a.print(); // 输出0
b.print(); // 输出0

上面这段代码的执行

HasPtrMem a;    // 调用HasPtrMem::HasPtrMem() : p(new int(0))
HasPtrMem b(a) // 实际上是HasPtrMem b = a,调用HasPtrMem::HasPtrMem(const HasPtrMem& h)

此时main函数执行结束后都会调用析构函数对p的内存进行释放,但是,对象b实际上是指向对象b的内存(相当于直接赋值)

C++浅拷贝深拷贝_c++

如果此时析构函数先对a对象进行析构,此时释放a对象里面指针p的内存,接着再对b对象析构,释放b对象的指针内存,程序crash(由于P的内存实际上在a对象已经被嘎掉了)

所以,类对象里面包含指针数据的,一定要实现深拷贝

2. C++ 深拷贝

深拷贝就是对实际内存进行分配,在对内存的值进行赋值填充(表达不好,有哪个意思懂就可以哈)

C++浅拷贝深拷贝_c++_02

深拷贝代码

// .h文件
class HasPtrMem
{
public:
HasPtrMem();
HasPtrMem(const HasPtrMem& h);
~HasPtrMem();

void print();
int *p;
};
// .cpp文件
HasPtrMem::HasPtrMem() : p(new int(0))
{
cout << "HasPtrMem()" << endl;
}

void HasPtrMem::print()
{
cout << *p << endl;
}

HasPtrMem::HasPtrMem(const HasPtrMem& h)
{
p = new int(*h.p);
}
HasPtrMem::~HasPtrMem()
{
delete p;
}

这就是深拷贝浅拷贝,不注意就会带来坑爹的代码,造成程序嘎嘎crash!!!!!


扫描二维码推送至手机访问。

版权声明:本文来源于网络,仅供学习,如侵权请联系站长删除。

本文链接:https://news.layui.org.cn/post/145.html

分享给朋友:

“C++浅拷贝深拷贝” 的相关文章

#打卡不停更#[图文并茂]Packstack部署train版openstack

Packstack部署openstack-train 介绍如何在centos7.9中使用packstack部署openstack-train。 首先需要安装一个最小化安装的centos7.9,按照你的网络环境配置好网络,然后重启。 这里我的环境是VMware虚拟机,ip是192.168.10.30. 首先我们需要关闭防火墙和NetworkManager systemctl disable --n...

十分钟速成DevOps实践

摘要:以华为云软件开发平台DevCloud为例,十分钟简单体验下DevOps应用上云实践——H5经典小游戏上云。 本文分享自华为云社区《​​《DevOps实践秘籍》十分钟速成DevOps实践​​》,作者:AppCloud小助手 。 DevOps是什么? DevOps是Development和Operations的组合词,简单点理解就是研发运维一体化的方法论,目的是通过自动化“软件交付”和“架构变...

【微信小程序】小程序的宿主环境

????系列专栏:微信小程序 ????欢迎关注????点赞????收藏⭐留言???? ✅个人主页:​​hacker_demo的51CTO博客​​ ????个人格言:不断的翻越一座又一座的高山,那样的人生才是我想要的。这一马平川,一眼见底的活,我不想要,我的人生,我自己书写,余生很长,请多关照,我的人生,敬请期待???????????? 宿主环境简介 宿主环境(host environ...

Golang依赖包的各项指标分析总结

专注于PHP、MySQL、Linux和前端开发,感兴趣的感谢点个关注哟!!!​​文章已收录​​,主要包含的技术有PHP、Redis、MySQL、JavaScript、HTML&CSS、Linux、Java、Golang、Linux和工具资源等相关理论知识、面试题和实战内容。 文章导读 在日常开发中,我们在自己的代码库中难免都会引入外部的包,或者公司内部的私有包。在引入这些包时,我们一般都...

devops学习笔记-jenkins实现基础CI/CD操作

在之前的devops工具链中完成了jenkins以及gitlab配置之后,可以实现基础的CI/CD操作。 操作流程 整体的操作的流程如下所示: 在开发环境配置好代码之后,将代码上传到gitlab,jenkins拉取gitlab的代码,由maven插件build,打包好后,构建 docker镜像,上传到目标服务器中运行,可以通过tag选择版本代码。 本地编写代码 使用idea编写一个基础的spr...

Python基础(十) | Numpy详细教程

第十一章 Numpy库 ⭐本专栏旨在对Python的基础语法进行详解,精炼地总结语法中的重点,详解难点,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握python编程,同时为后续的数据分析,机器学习及深度学习的代码能力打下坚实的基础。 ????本文已收录于Python基础系列专栏: Python基础系列教程 欢迎订阅,持续更新。 10.1 为什么要用Numpy 10.1.1  ...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。