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) 多次析构同一个成员变量,不会存在问题。
阅读(503) | 评论(0) | 转发(0) |