c++ string类型成员变量在调用构造函数后未能正…

2019-08-26 05:36:48来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

c++ string类型成员变量在调用构造函数后未能正确赋值

struct RelItem{
    string segName;
    Elf32_Rel* rel;
    string relName;
    RelItem(string seg, int addr, string lb, int t); 
};
RelItem::RelItem(string seg, int addr, string lb, int t){ 
    segName = seg;
    relName = lb; 
    //rel = new Elf32_Rel(); //root cause
    rel->r_offset = addr;
    rel->r_info = t;
}

该string类型变量relName是类的最后一个成员变量,在此之前还有有两个成员变量,分别是string类型和指针类型.

调试过程中发现在rel指针变量未new 新值的情况下,构造函数依然能够正确返回,gdb调试发现rel变量并非空指针,

最终在打印relName的时候发现有乱码,

怀疑是因为rel变量没有分配新的内存空间,构造函数赋值的过程因为先赋值了后声明的变量relName

导致rel指针也被赋值了一个随机值,从而修改了其他变量的值导致打印错乱.

如果我们将rel和relName的声明顺序调换下,构造函数不变,gdb调试的时候发现在

rel->r_offset = addr;

 就会报告rel空指针异常,从而能够提早发现问题

总结:

在构造函数对成员变量赋值的过程中,推测应该会按照成员变量声明的顺序分配空间

因此如果指针变量(声明顺序靠前)在未赋值的情况下,会出现后赋值的变量因为需要分配空间,随机分配了一个值给指针变量

从而导致gdb调试未能第一时间发现问题,影响后续调试以及程序运行结果


原文链接:https://www.cnblogs.com/tareq/p/11393708.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:day18

下一篇:虚函数探秘