VC6 MFC DLL类成员float 变量赋值后,类的子类成员变量数据被变更 0xa4, 0xcd
子类有一个 bool 成员变量
在dll接口中给float赋值后0.1f, 0.99f,子类成员变量 bool值 有规率的 从0XCD 变成 0xa4
后来将类型改成double后,问题消失,后来想重现问题未能实现
事后怀疑数据被串改,只能回想内存布局
bool 初始值false,内存如下:
1408daa0 00 cd cd cd 5a 56 40 00 2a 3f
赋值 对应16进制 float:
0.1F = 0x3DCCCCCD ,
0.99F = 0x3F7D70A4
0482D63C A4 70 7D 3F 5A 56 40 00 2A 3F, 版权:不及格的程序员
看16进制形式,数据应该是被覆盖了,但是数据位如何串的原因找不到了,结论就是C++的内存好危险。
不过以后遇到此类问题可以留意了,记录内存变化图谱追踪问题,这里就不重现了浪费时间。
2023-04-10更新:
原因好像是找到了, 自定义MFC消息映射原型写的不对,出错的函数我没有声明两个附加参数
之所以发现这个是因为在一个Realse项目中调用回调时闪退了(调试项目的debug与release均未发现问题,此问题很隐辟,由其是在消息循环中崩溃,难以找到源头),通过缩减代码,停用代码最终定位进度条回调刷新消息有重大嫌疑,找来找去应该是这里有问题,改成对应函数声明格式,闪退问题消失。
闪退是在消息循环内部抛出的。。。 找了4天时间
// User extensions for message map entries // for Windows messages #define ON_MESSAGE(message, memberFxn) \ { message, 0, 0, 0, AfxSig_lwl, \ (AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM))&memberFxn }, LRESULT BaseWorkThread::onFinishPercent(WPARAM wParam, LPARAM lParam) { //可以像委托那样, 再声明一个指针也可以继承此类,调用针指将百分比传递出去 //本例并没有提供函数指针,可以采用多重继承然后调用子类成员函数传递百分比。 onPercent(this->mPercent); return 0; } BEGIN_MESSAGE_MAP(BaseWorkThread, CWnd) //{{AFX_MSG_MAP(BaseWorkThread) // NOTE - the ClassWizard will add and remove mapping macros here. //}}AFX_MSG_MAP ON_MESSAGE(WM_ONTHREADFINISHED, workder_onFinished) ON_MESSAGE(WM_ONWorkFinishPercent, onFinishPercent) END_MESSAGE_MAP()
南来地,北往的,上班的,下岗的,走过路过不要错过!
======================个性签名=====================
之前认为Apple 的iOS 设计的要比 Android 稳定,我错了吗?
下载的许多客户端程序/游戏程序,经常会Crash,是程序写的不好(内存泄漏?刚启动也会吗?)还是iOS本身的不稳定!!!
如果在Android手机中可以简单联接到ddms,就可以查看系统log,很容易看到程序为什么出错,在iPhone中如何得知呢?试试Organizer吧,分析一下Device logs,也许有用.