一个结构体初始化问题
来源:互联网 发布:linux 修改二进制文件 编辑:程序博客网 时间:2024/05/08 18:12
今天在集成程序时,一个同事调试他那部分时出了一个诡诈的问题,delete一个堆变量时程序crash掉。开始以为某个没有重新编译的问题(因为以前遇到过诡诈的问题,是没有重新编译,编译器的bug导致),结果不是,#prama pack(push/pop)没有配对(也遇到过没配对出现不可预期的问题)。都不是。
开始在delete处反汇编调试,发现EAX寄存器(应该是析构函数首地址)变成0.导致程序crash掉。挺怪异。仔细研究了一下此结构体,发现有虚指针。且虚指针为0.这就是程序死掉的原因。为什么为0?还以为其他地方给修改了。(发现在结构体刚New完,虚指针就为空)。找到结构体定义处,发现问题所在。
以下为定义示例:
struct AA
{
...
}
struct BB
{
struct AA* m_pAA;
....
BB()
{
memset(this,0,sizeof(struct BB) ); //问题所在,以前还没见过这么用的,导致虚指针为空,
//如果没有虚指针这么用没有什么问题。
}
virtual ~BB() //问题所在
{
if( m_pAA != NULL)
{
delete m_pAA;
m_pAA = NULL;
}
}
}
总结两条结论:
(1): 结构体构造函数不要对this指针直接操作(不小心会出现不可预期的问题),仅对其成员变量进行初始化就可以了。
(2):结构体不需要继承,没有必要用虚函数,这会增大结构体体积(虚指针会占4个字节)。如果有虚函数,直接用类好了。
- 一个结构体初始化问题
- 结构体的初始化问题
- 结构体指针初始化问题
- 结构体的初始化问题
- 定义一个结构体数组并初始化时出现的问题
- 01. C++结构体的初始化问题
- 结构体初始化--指定初始化
- 关于结构体初始化需要注意的一个细节
- 一个C/C++结构体初始化有趣的现象
- 一个题目,涉及结构体数组的初始化与输出
- 关于结构体数组初始化的问题--深入举例
- linux内核驱动中 结构体 初始化 逗号问题
- Cstring使用问题和struct结构体初始化方法汇总
- Cstring使用问题和struct结构体初始化方法汇总
- struct 结构体的定义及初始化问题
- C语言使用宏初始化结构体的问题
- C中struct(结构体)初始化的问题
- 结构体初始化问题——引入未知参数
- 老化工转型新材料(加快经济发展方式转变·访谈录)
- ORA-00001: 违反唯一约束条件
- 实时传输协议RTP
- windows mobile下保存xml
- c中可变参数用法小记
- 一个结构体初始化问题
- net中前台javascript与后台c#函数如何相互通信
- 使用Json.NET出现“文档的顶层无效。处理资源 URl 时出错。第 1 行,位置: 1
- 简化生活的七大好处
- 信息公开,积跬步以至千里(时事观察)
- 我需要答案,数学的
- 朋友们,大家好。
- 2-PCI局部总线note2
- 通用数据转移