《从缺陷中学习C/C++》——6.4 临时对象的生存期-阿里云开发者社区

开发者社区> 异步社区> 正文

《从缺陷中学习C/C++》——6.4 临时对象的生存期

简介:
+关注继续查看

本节书摘来自异步社区出版社《从缺陷中学习C/C++》一书中的第6章,第6.4节,作者: 刘新浙 , 刘玲 , 王超 , 李敬娜 , ,更多章节内容可以访问云栖社区“异步社区”公众号查看。

6.4 临时对象的生存期

从缺陷中学习C/C++
代码示例

class MyString { 
  public: 
  MyString(){
    s_ = (char *)malloc(strlen(str) + 1);
    strcpy(s_, str);
  }
  ~MyString() {
    printf("destory\n");
  }
  friend MyString operator+(const MyString &lstr, const MyString &rstr){
    size_t llen = strlen(lstr);
    size_t rlen = strlen(rstr);
    char buf[llen + rlen + 1];
    strcpy(buf, lstr);
    strcat(buf, rstr);
    return MyString(buf);
  }
  operator const char *() const { //当string转换char* 时调用
    return _s;
  }
  private:
    char *_s;
  };
  int main()
  {
    MyString s1("hello "), s2("world !");
    const char *p = s1 + s2;
    printf("%s\n", p);
    return 0;
}

现象&结果
程序运行时通常是正常的,但有时会出错,特别是在多线程时,会出现奇特的错误:例如,指针p指向的内容不是期望的内容。

Bug分析
错误出在main函数中的const char *p = s1 + s2代码行处。程序会首先生成一个临时对象,用来存储s1+s2的值,然后再把临时对象的值赋给p,随后该临时对象析构。所以,指针p指向了一块非法内存。因为临时对象已经被析构,所以这块非法内存被系统识别为“未使用”的状态,可以被再分配使用。如果在程序中没有其他操作读写这块内存时,其内容还没有被改变,所以,可能输出符合程序预期的正确结果。但是,没有任何方法阻止那块内容的改变。所以,如果有其他操作对这块内存单元进行写操作后,可能输出的是随机值。

正确代码
在main函数中显式给出临时对象:

int main()
{
    MyString s1("hello "), s2("world !");
    String temp = t1 + t2;
    const char *p = temp;
    printf("%s\n", p);
    return 0;
}

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
跟着动画学习 TCP 三次握手和四次挥手
TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一。很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答。期望读者们可以更加简单地地理解TCP交互的本质。
1807 0
javascript学习之路之元素获取和设置属性
收拾心情,学习学习js!总结下自己的学习所得! 现有的有三种方法可以获取元素的节点,分别是通过元素ID,通过标签名和类名来获取的 1.GetElmentById:将返回一个与那个有给定ID属性的值的元素节点对应的对象,方法只有一个参数,元素的id属性的值必须放在单引号或双引号里 documrnt.
696 0
JavaScript Window - 浏览器对象模型
浏览器对象模型 (BOM) 使 JavaScript 有能力与浏览器“对话”。 浏览器对象模型 (Browser Object Model) 尚无正式标准。
899 0
【Science】CMU机器学习系主任:八个关键标准判别深度学习任务成功与否
AlphaGo战胜人类、机器人写作、人脸识别……越来越多的人工智能设备正在进入人们的生活,并从事流水化的工作。有人认为未来人类的工作将被机器学习所取代,人们面临失业的危险。Erik Brynjolfsson和Tom Mitchell从技术与经济学角度,来分析上述结论是否能站住脚。
1564 0
C++学习
C++的学习之路比较漫长,自己感觉学习C++应该首先是找一本比较基础的教程书先看一遍多做笔记,然后在多看几本比较基础的C++资料,在有一定的基础的情况下再去看一些晋级的书籍,C++的语法及结构思想学习完之后再涉猎一些关于UML统一建模语言、OOP...
700 0
Linux 学习笔记-第一阶段-基础入门之Linux 安装与分区03
Overiew安装Linux,首先要有镜像文件,以CentOS为例,可以在官网或者国内某些镜像Server来获取镜像。根据自己的需要可以选择是 Everything 或者minimal iso.这里不写关于安装的细节,对于其中的一些关键步骤做些说明。
1156 0
+关注
异步社区
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
12049
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载