上海营销型网站建设平台昆明网站制作服务商

diannao/2026/1/19 18:04:23/文章来源:
上海营销型网站建设平台,昆明网站制作服务商,深圳企业建站模板,wordpress数据查询网站这是一篇对什么是C的The Rule of Three的错误更正和详细说明。阅读时间7分钟。难度⭐⭐⭐虽然上一篇文章的阅读量只有凄惨的两位数#xff0c;但是怀着对小伙伴负责的目的#xff0c;必须保证代码的正确性。这是大厨做技术自媒体的态度。前文最后一段代码是这样的#xff1a… 这是一篇对什么是C的The Rule of Three的错误更正和详细说明。阅读时间7分钟。难度⭐⭐⭐虽然上一篇文章的阅读量只有凄惨的两位数但是怀着对小伙伴负责的目的必须保证代码的正确性。这是大厨做技术自媒体的态度。前文最后一段代码是这样的class Dog { private:   char* name;   int age; public:   ...省略构造和拷贝构造函数...    //拷贝赋值函数   Dog operator(const Dog that) {     name new char[strlen(that.name)1];     strcpy(name, that.name);     age that.age;   }   ...省略析构函数...};先不谈异常安全这段拷贝赋值函数的代码本身有什么问题有3个问题没有释放原对象指针成员指向的内容没有返回值没有自赋值检查下面我们一个一个分析。 1   没有释放原对象指针这个问题很严重因为一定会造成内存泄露。原因是指针所指的内存未被释放而指针又指向了别处。例子如下我们写了一个main函数长这样int main(int argc, char* argv[]) {    Dog D1(Bobby, 2);    Dog D2(Teddy, 3);    Dog D2 D1;}D1和D2分别是是Dog的对象。根据构造函数的定义D2中的name指针指向了字符数组“Teddy”。而当进行D2 D1操作时name  new char[strlen(that.name)1]这一步会在D2中重新创建一个名字为name且指向“Bobby”的指针。这么做也许编译器不会报错但是会有问题。因为在new一个name指针之前原本的name指针指向的内存并没有被释放。而新的name指针只对新创建的内存负责老的内存已经变成无主之地。看来内存泄露是逃不掉了。这个问题看着复杂解决的办法倒是简单只需要在拷贝赋值函数体第一行加上 delete[] name就可以了。class Dog { private:   char* name;   int age; public:   ...省略构造和拷贝构造函数...    //拷贝赋值函数   Dog operator(const Dog that) {     delete[] name; //释放原对象指针成员指向的内容     name new char[strlen(that.name)1];     strcpy(name, that.name);     age that.age;   }   ...省略析构函数...};2   没有返回值第二个问题犯的错很低级拷贝赋值函数的行为和普通函数一样需要一个返回值。而返回值的类型通常是类的对象的引用。参照常用的写法这里返回*this(this是C类的隐藏成员表示对象本身)。class Dog { private:   char* name;   int age; public:   ...省略构造和拷贝构造函数...    //拷贝赋值函数   Dog operator(const Dog that) {     delete[] name; //释放原对象指针成员指向的内容     name new char[strlen(that.name)1];     strcpy(name, that.name);     age that.age;     return *this; //返回对象引用   }   ...省略析构函数...};另外大家可能有疑问为什么返回值是一个引用而不是一个值呢答案是只有引用才能进行连续赋值。假设有3个Dog对象D1、D2、D3如果返回值不是引用那么类似D1 D2 D3将不能通过编译。 3   没有自赋值检查什么叫做自赋值就是两个相同对象之间用等号连接比如int main(int argc, char* argv[]) {    Dog D1(Bobby, 2);    Dog D1 D1; //同一个D1相互赋值}当然一般不会有人写出这样的代码来。这里只是举个简单的例子但是如果在大型项目中不同开发者对同一对象取了不同的别名那么自赋值的情况是有可能发生的。对于上面的Dog类而言如果执行D1 D1那么会发生下面的事情首先对象D1中的name指针被析构name指向的内存被释放然后下一行中的strlen(that.name)又用到了D1的name所指向的内存。重点来了这时你会惊讶地发现编译器提示你name已经不存在了因为在编译器看来你在做对同一对象先释放了内存再使用的非法事情就好比你是拆迁大队的你没有确认拆的是不是自己的房子就不管三七二十一直接拆了然而你晚上还要回家住......C真的烧脑仅仅是不小心把自己赋值给了自己就把自己的一部分给搞丢了这在其他语言中似乎是天方夜谭。但是C似乎很情愿把事情搞复杂。幸好自赋值问题也很容易修复只需要在delete指针之前做一个自赋值的判断。完整代码如下class Dog { private:   char* name;   int age; public:   ...省略构造和拷贝构造函数...    //拷贝赋值函数   Dog operator(const Dog that) {     if(this ! that) { //判断是否自赋值         delete[] name; //释放原对象的指针指向的内容         name new char[strlen(that.name)1];         strcpy(name, that.name);         age that.age;     }     return *this;   }   ...省略析构函数...};this ! that这个判断的写法看上去莫名其妙大厨来给大家分析一下this代表D1D1中等号左边的D1that代表等号右边的D1的引用(本质上还是D1)。this和that二者如果相等就说明是同一个对象那么拷贝赋值函数就直接返回对象的引用。至此三个问题终于都解决了 4   总结时刻通过以上问题的剖析可以发现C一大半奇奇怪怪行为的背后都有一个处理不当的指针。另外写一个正确的类真的一点都不简单需要考虑内存泄露返回值类型自赋值等等情况。打住再说下去大厨真的转行成C专业劝退师了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php网站开发教程下载广州好的做网站公司

小猪的Android入门之路 Day 1 Android相关背景与开发环境的搭建 ------转载请注明出处:coder-pig 本节引言: 随着社会经济的发展,移动互联网的越来越热,手机APP开发显得格外火爆, 作为一名快要毕业的IT屌丝,自然要趟一趟这一浑水啦,当前主流的手机系统 IOS(苹果),Android(安卓)…

临海手机网站上海4a广告公司排名

Docker 入门使用说明 Docker 安装 Docker 官网:Docker Docker 安装说明:Docker 安装说明 这里由于 Docker 在实时更新,所以每次安装 Docker 用来导入 key 的链接可能会有变化,这里就参考官方的安装方法即可 Docker 常用命令说…

做网站有骗子平面设计找图网站

参考 一文学会如何做电商数据分析(附运营分析指标框架) 电子商务该如何做数据分析?如何数据分析入门(从各项指标表象进入) https://www.processon.com/outline/6589838c3129f1550cc69950 数据分析步骤 什么是数据分析…

自己怎么拍做美食视频网站百度域名值多少钱

摘要 如果要判断某一脚本是否在运行,可以通过psutil库获取所有进程的cmdline,并判断指定的文件名是否在cmdline中。 目录 1.psutil库简介 2.检查代码及说明 2.1检查思路 2.2异常捕获 2.3执行方法 1.psutil库简介 psutil 是一个跨平台(…

用dw做音乐网站wordpress中文二次元

1.原因:出现了特殊字符 SpringBoot 2.0.0 以上都采用内置tomcat8.0以上版本,而tomcat8.0以上版本遵从RFC规范添加了对Url的特殊字符的限制,url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~四个特殊字符以及保留字符( ! * ’ ( ) ; : &…

电子商务网站建设复习题哪有网站建设明细报价表

uni-app 微信小程序:启用组件按需注入 文章目录 uni-app 微信小程序:启用组件按需注入一、官方文档按需注入注意事项 二、HBuilder X 设置三、效果 一、官方文档 https://developers.weixin.qq.com/miniprogram/dev/framework/ability/lazyload.html 按…

城乡建设部网官方网站网站群建设招标

说一说vue钩子函数 钩子函数是Vue实例创建和销毁过程中自动执行的函数。按照组件生命周期的过程分为:挂载阶段 -> 更新阶段 -> 销毁阶段。 每个阶段对应的钩子函数分别为:挂载阶段(beforeCreate,created,befor…

上的网站app创建网站容易吗

转自:http://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html 下面是对socket操作的封装,因为在Linux下写中文到了windows里面会乱码,所以注释用英文来写,有空再查下解决方法吧 socket.h #ifndef SOCKET_H #define SOCKET_…

西安网站建设动力无限移动关闭流量自动续费

1 概述 单例模式就是保证一个类只有一个对象实例。 为了保证无法创建多余的对象实例,单例类中需要自己创建对象实例,并把自己的构造方法私有化以防止其他地方调用创建对象,且需要提供一个公共的方法给其他类来获取该单例类的实例。 同时单例…

吉林移动网站长沙微商城网站建设

关系数据库的几种设计范式介绍1、第一范式(1NF) 在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。 所谓…

手把手教你实现电商网站开发做静态网站接单

Mycat核心教程--ZooKeeper集群搭建 八、 ZooKeeper集群搭建8.1.ZooKeeper简介8.2.数据复制的好处8.3.Zookeeper设计目的8.4.zookeeper集群包括3种角色8.4.1.Leader角色8.4.2.Follower 角色8.4.3.Observer 角色 8.5.zookeeper集群工作流程8.6.zookeeper集群节点数量为奇数&#…

效果图网站名字哪个云电脑好用又便宜

编者注 :在本文中,我们提供了Java教程中的全面抽象。 抽象发生在类级别的设计中,目的是隐藏实现API /设计/系统提供的功能的方式的实现复杂性,从某种意义上讲简化了访问底层实现的“接口”。 此过程可以在越来越“更高”的抽象层次…

网站做飘浮怎么做南沙区做网站公司

JVM 的架构模型 Java 编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。 具体来说,这两种架构之间的区别: 基于栈式架构的特点: 设计和实现更简单,适用于资源受限…

网站怎么做IPv6wordpress 视频存储

目录 引言基础路由配置路由参数与查询参数路由前缀与子路由路由重定向结语 引言 上篇文章我们简单介绍了express的基础用法,包括express的安装、创建路由及项目启动,对express有了一个基础的了解,这篇开始我们将详细介绍express的一些高级用…

网站开发是无形资产怎么做网站端口代理

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Player.cs using System.Collections; using System.Collections.Generic…

一个成功网站要素主要有哪些字体设计类网站

确定碰撞体积 选择rigidbody2d,创建player重力 创建player碰撞体积 创建瓦片地图碰撞体积 使平台变成一个整体 ​​​​​ 设置Body Type为Static(避免平台也因为重力影响下落) 回到Player,在Rigidbody2D中设置为冻结旋转 Player设…

东莞门户网站建设方案网站设计方案书

我需要一些可能非常基本的帮助.我正在研究一个接收这些可能的输入字符串的PHP函数(这些是示例,它可以是任何分辨率):1600x9001440x9001366x7681360x7681280x10241280x8001024x10241024x768640x960320x480320x480etc我想处理这些字符串中的任何一个并返回适当的宽高比…

网站单页做301南京企业网站设计

目录 一、特征统计量 1.概率分布 2.特征统计量 二、平稳时间序列的定义 严平稳与宽平稳的关系 三、平稳时间序列的统计性 四、平稳性的重大意义 五、平稳性检验 时序图检验 自相关图检验 R绘图 一、特征统计量 平稳性是某些时间序列具有的一种统计特征要描述清楚这个…

车辆对比那个网站做的好效果图网站发帖平台

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvueuniapp的智能小程序商城管理系统(源代码数据库15000字论文)120 一、系统介绍 本项目前后端分离,分为用户、商家、管理员三种角色 1、用户&#…

视频网站后台模板延庆营销型网站建设

主要内容:进程之间的通信与端口、UDP协议、TCP协议、可靠传输原理(停止等待协议、ARQ协议)、TCP报文首部、TCP三大题:滑动窗口、流量控制、拥塞控制机制 5.1 运输层协议概述 运输层向它上面的应用层提供通信服务,真正…