当前位置: 首页 > news >正文

舆情网站入口wordpress文章添加seo标题代码

舆情网站入口,wordpress文章添加seo标题代码,企业营销型网站建设团队,贵阳市网站建设公司事情是这样的:博主今天回看以前实现过的string,当时就遇到了一个bug:可见博主当时的破防。因为最近在集中复盘C初阶部分,就有点好奇年轻的时候自己写的模拟string是什么样。没想到给我自己留了个bug。现在来细看这个场景:为了测试…

事情是这样的:

博主今天回看以前实现过的string,当时就遇到了一个bug:

可见博主当时的破防。因为最近在集中复盘C++初阶部分,就有点好奇年轻的时候自己写的模拟string是什么样。没想到给我自己留了个bug。


现在来细看这个场景:为了测试自己写的赋值拷贝现代写法效果,有了这个函数。

	void test11(){//现代构造的写法string s("helloworld");string s2(s);// 现代拷贝构造cout << s2 << endl;string s3("cherry magic");s2 = s3;// 现代赋值拷贝cout << s2 << endl;}

当来到165行时——即我打算让s3赋值给现有的对象s2,此时自然要调用我亲手写的赋值拷贝

图1 调试到165行
图2 亲手写的赋值拷贝

当我按F11,企图跳进operator=里时,却是来到了拷贝构造这里。

嗯?此举何意啊——正常意料:我亲手写的赋值拷贝operator=传的参数是传值传参(传值(自定义类型string)传参都要雷打不动先拷贝构造一份)

图2 继续下一步,来到了string的拷贝构造函数

没错,拷贝构造我也写出了现代写法——避免这里长篇大论,现代写法我几句话说个大概,说不定读者看完就能上手写。

string tmp(s.c_str());//tmp建立在当前函数栈上,等当前函数结束,函数栈帧被销毁,生命周期也结束了。

当这句话执行完,tmp就是存在于当前栈上,但内容是拷贝s的string对象。我们拷贝构造函数的目的,就是让当前的*this(未构造的对象)拷贝传入对象s的内容,完成对象初始化。

无论如何,当拷贝构造函数结束,*this是完全实例化,tmp却要走向独属它的落幕(因为tmp是string自定义类型对象,它自动会调用析构完成资源释放)。

tmp拷贝完了,*this还没拷贝。怎么办?把*this有个大胆的想法——

swap(tmp);// 完整写 this->swap(tmp); 或者 (*this).swap(tmp);

看我的批注:*this用自己的成员函数将tmp和自己交换——交换了拷贝的内容。*this就这么轻轻一换完成了拷贝构造,tmp就拿着本来无用的信息去析构了。


我们继续按F11,等此次拷贝构造结束——跳入operator=的参数就构造完成,我们就进入operator=看看问题出在哪。

图3:先拷贝构造
图4:string tmp(s.c_str())已然完成
图5:*this拷贝构造完成

tmp此时该走向独属于它的落幕——身为string家中的长(栈)子,它有自己的使命(*this是次子(bushi

图6:tmp开始析构
图7:首先析构的——tmp的成员变量_str指向堆上的资源
图8:报错了,牛

其实刚刚那一步,可能有读者看出不对劲了。tmp交换过来的内容,应该是完全没被初始化的——怎么可能会有需要的释放的资源?那个_str也是生得奇怪——恰好是随机值,躲过了判空检查,所以避无可避地执行了delete[] _str;

我今天在改这个代码的时候,其实没注意到这点:因为出了构造函数完成了参数的拷贝构造,我想着此时该进入operator=了。直接按下了F10——跳过了tmp的析构,直接出现了这一幕。

所以下意识判断是operaor=的问题:这也是为什么我会当时写下这句判断——

图9:看得出来年轻时候第一次写现代写法,很没底气。一报错就怀疑上了

真相是什么?

今天在改代码的时候,我发现因为*this天生生得潦草,_str这个指针怎么生都是随机值——所以tmp换到它的内容,必走析构里的delete[] _str;——这件事让我很是苦恼,知道哪里出问题了,却是下不了手。

有没有什么方法?有的,只是我忘了(我忏悔)

初始化列表

我今天也是开眼了,拷贝构造也是构造。只要是构造函数,类型的成员变量就会走初始化列表——初始化列表存在的意义就是对成员变量定义。

身为变量,有了声明自然要有定义。所以不管显示写初始化列表与否,成员变量都会被定义(即成员变量都会走初始化列表)。初始化列表是很客观的存在,不是我们不写就不存在的。

如果显示写初始化列表,相应成员变量都会被规定的值初始化;
如果不显示写,可以在声明的位置给出缺省值——没错,这里的缺省值就是给未显示写在初始化列表的成员进行定义

  • 如果声明都不给缺省值了,那编译器表示:“那我随意了”——对于内置类型,编译器会给它随机值(取决于编译器,行为不确定);对于自定义类型,会去调用它的默认构造(如果没有默认构造,会编译报错)

想起来了,我再看我的string成员变量声明——果然没有声明值,而且刚刚的拷贝构造也没显示初始化列表(完美地避开正确初始化机会)

图10:string类的成员变量声明
图11:加上缺省值,静态成员变量在其他地方定义了

再看效果:

图12:成功运行

我发现AI摘要比我写得完整,但我想没我写得有趣:(对只是我想)
摘要:博主复盘自己早期实现的string类时,发现了一个隐藏bug。问题出现在拷贝构造函数的现代写法中:当交换临时对象tmp和未初始化的*this时,由于未显式初始化_str成员变量,导致析构时delete了一个随机地址。通过给成员变量添加缺省值,解决了这个因未初始化引发的未定义行为。文章详细记录了调试过程,揭示了C++构造函数初始化列表的重要性,以及显示初始化成员变量的必要性。最终修复方案是为string类的成员变量添加了缺省值声明,使程序得以正确运行。

http://www.dtcms.com/a/535982.html

相关文章:

  • Android分区刷机原理深度解析:从Bootloader到Framework的完整启动流程
  • 高防 IP 如何保护企业网站?
  • 原创 网站 源码Discuz网站制作教程
  • windows 2003建设网站网站制作案例市场
  • mysql的安装和卸载过程
  • 软件设计师知识点总结:算法设计与分析
  • 互联网设计公司网站wordpress 404页面模板
  • python+ai智能根据doc教案文档生成ppt
  • PPT WPS ERROR +mn-ea
  • 技术解析 | QtScrcpy:一款基于Qt的跨平台Android投屏工具的实现原理与代码架构
  • F037 vue+neo4j 编程语言知识图谱可视化分析系统vue+flask+neo4j
  • qt设置运行框左上角图标
  • 大量PPT文件怎么快速转换成JPG格式的长图
  • 网站数据怎么做接口供小程序调用企业手机网站建设策划方案
  • LabVIEW机械零件尺寸检测
  • 网站建设公司整站源码专做网站公司
  • ProfiNet转EtherNet/IP工业智能网关实现欧姆龙PLC与倍福I/O模块通讯的实操案例
  • AR工业巡检:虚实融合的智能巡检技术详解
  • 【LUA教程】LUA脚本语言中文教程.PDF
  • 初识影刀--一款 AI 驱动的 RPA 自动化软件
  • SAP SD客户对账开票功能分享
  • 洛谷 P1177:【模板】排序 ← 基数排序实现
  • 株洲网站设计外包首选中国可信网站查询
  • 物联网智慧医疗:告别胶片时代的就医革命
  • 3步实现MQTT远程连接!EMQX+cpolar构建物联网消息高速公路
  • 怎么注册微网站织梦建设网站全过程
  • [无人机sdk] `FlightController` | startTakeoffSync() | actionSync()
  • [linux仓库]线程与进程的较量:资源划分与内核实现的全景解析[线程·贰]
  • Flutter开发HarmonyOS鸿蒙App商业项目实战已出炉
  • 宁波网站建设制作公司排名网站优化外链怎么做