c++ string类型成员变量在调用构造函数后未能正确赋值
程序员文章站
2023-11-13 10:09:58
该string类型变量relName是类的最后一个成员变量,在此之前还有有两个成员变量,分别是string类型和指针类型. 调试过程中发现在rel指针变量未new 新值的情况下,构造函数依然能够正确返回,gdb调试发现rel变量并非空指针, 最终在打印relName的时候发现有乱码, 怀疑是因为re ......
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调试未能第一时间发现问题,影响后续调试以及程序运行结果