Chinaunix首页 | 论坛 | 博客
  • 博客访问: 541010
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 19:40:37

1 现象:问题描述
某产品从Solaris移植到Windows上,运行过程产生了core。
2 关键过程:根本原因分析
根据core信息,调试环境下单步跟踪,core发生在I2kNEEngineImpl类的析构函数之后,析构成员变量m_STReceiver的时候core掉,但构造函数中没有对该成员进行初始化。
m_STReceiver的申明如下:
CommSgTrace::TSTReceiveData_var m_STReceiver; //消息跟踪结果接收者
该成员是在走消息跟踪流程时才会用到。
从上可以看出,问题的原因是析构了一个没有初始化的对象导致了core。
构造函数没有对var对象初始化,Unix平台会默认初始化赋值NULL,在销毁I2kNEEngineImpl类实例的时候就不会对m_STReceiver调用析构函数。而Windows平台对CORBA var对象不会自动初始化,在销毁I2kNEEngineImpl类实例的时候析构m_STReceiver对象,而m_STReceiver是一个不存在的对象,导致core。
3 结论:解决方案及效果
在I2kNEEngineImpl类构造函数中,对成员m_STReceiver初始化:
m_STReceiver = NULL;
4 经验总结:预防措施和规范建议
不论是什么类型的成员变量,建议在构造函数中初始化!
5 备注
6 考核点
成员变量的初始化。
7 试题
1、 关于成员变量的描述,下面正确的是:C
A) 没有使用到的成员变量,无需在构造函数中初始化。
B) 多次析构同一个成员变量,不会存在问题。
阅读(455) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~