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调试未能第一时间发现问题,影响后续调试以及程序运行结果
c++ string类型成员变量在调用构造函数后未能正确赋值的更多相关文章
- C++ static、const和static const类型成员变量声明以及初始化
C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. sta ...
- StringUtils.isBlank()检验String 类型的变量是否为空
在校验一个String类型的变量是否为空时,通常存在3中情况 是否为 null 是否为 "" 是否为空字符串(引号中间有空格) 如: " ". Str ...
- 使用 JavaScript 中的变量、数据类型和运算符,计算出两个 number 类型的变量与一个 string 类型的变量的和,根据 string 类型处于运算符的不同位置得到不同的结果
查看本章节 查看作业目录 需求说明: 使用 JavaScript 中的变量.数据类型和运算符,计算出两个 number 类型的变量与一个 string 类型的变量的和,根据 string 类型处于运算 ...
- java 中,new一个新对象时,是先给成员变量赋上初值后 再来调用类中的构造函数的。
今天学习时法现一个问题,我们定义了一个Test类,在主类中new了一个他的对象,发现:在新建对象中所有的成员变量是先给定了默认初值的:0,null或者false, 之后再调用的构造函数.(如果变量是由 ...
- Java中在实例化一个类时,这个类中没有初始值的int类型成员变量i,i的值是不是0?
java中有两种类型一种是数值性,另一种是类变量数值性变量的初始值为0,类变量的初始化为null没做初始化成员变量int性变量是0, 在java中有这么一条规则,声明在方法中的变量在使用时必须要初始化 ...
- 【C++】const,static和static const类型成员变量声明及其初始化
1)const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间 void f1() { ; cout<<x<<endl; ...
- 【原】结构体包含CString类型成员变量出错的原理
问题如下:我定义了如下的一个结构体: typedef struct{ CString csText;}MyStruct; 并有如下的程序段1:MyStruct * p=NULL;p=(MyStru ...
- [转载] C++ 类中的类成员变量怎么调用带参数的构造函数来初始化?
#include "stdafx.h" class A { public: A(){ax = ;}; A(int a){ax = a;}; int ax; }; class B { ...
- 面向对象的特性-为String类型的变量扩展一个replaceAll()函数
———————————————————————————— <script type="text/javascript"> //按钮 ...
随机推荐
- Airflow 配置celery+rabbitmq和celery+redis
Airflow 配置celery+rabbitmq 1.安装celery和rabbitmq组件 pip3 install apache-airflow[celery] pip3 install apa ...
- mongodb的权限操作
一.开启权限认证 1.windows下的mongodb开启权限认证 C:\Users\Administrator>sc delete MongoDB //原来创建的服务如果没有开启 则删除 [S ...
- PHP 连接本地mysql
<?php echo microtime(true); ?> <?php $servername = "localhost"; $username = " ...
- 如何用Python删除一个文件?
删除文件 path,删除时候如果path是一个目录, 抛出 OSError错误. remove() 同 unlink() 的功能是一样的 os.remove('a.txt') 如果remove文件夹就 ...
- (转)hadoop 集群常用端口
转载于:https://www.cnblogs.com/liying123/p/7097806.html hadoop集群的各部分一般都会使用到多个端口,有些是daemon之间进行交互之用,有些是用于 ...
- IDEA上安装Scala环境执行测试
1.安装scala IDEA下载Scala插件 IDEA->setting->Plugin->搜索Scala->选择Scala,然后, 2.删除火狐软件 sudo apt-ge ...
- elasticsearch工作笔记002---Centos7.3安装最新版elasticsearch-7.0.0-beta1-x86_64.rpm单机版安装
新版本es安装问题: https://blog.csdn.net/lidew521/article/details/88091539
- OpenJudge计算概论-矩阵交换行
/*======================================================================== 矩阵交换行 总时间限制: 1000ms 内存限制: ...
- 简易的CRM系统案例之Struts2+JSP+MySQL版本
对简易的CRM系统案例之Servlet+Jsp+MySQL版本改进 Servlet优化为Struts2 学习 <?xml version="1.0" encoding=&qu ...
- Unicode浅析——调用科大讯飞语音合成接口(日语)所遇到的天坑
如题,最近做的项目需要调用科大讯飞的语音合成接口,将日文合成日语.然后坑爹的是跟我对接的那一方直接扔过来一份接口文档,里面并未提及日语合成所需要的参数.中文.英文合成倒是没问题,就这个日语合成的音频始 ...