精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源开源心得,禁止任何转载,有技术问题请找锐英源孙老师QQ396806883,微信ryysoft。
近期用VC++2010开发电机设备监控和管理系统,遇到奇怪的问题,在函数退出返回上级时,出现堆栈破坏错误,提示就象标题这样,现在把一些过程描述下,供大家学习提高。
在出非法操作提示窗口上,点重试按钮,看到的代码行是函数的结束花括号,所以要定位哪个变量导致的堆栈破坏!
我记的以前好像把对象类型修改为指针可以,改过后不行
先是用注释掉区块代码的方法来定位,找了半天也没头绪,后来从网上找了个断言: _ASSERTE( _CrtCheckMemory( ) )。定位到是一个对话框定义时出问题。
这时候想到以前写股票软件时,也遇到过类似问题,是调整对话框里成员的位置来解决的,所以照搬这个做法,把对话框里的如下成员:
CScrollBar m_srlslvalue; CScrollBar m_srltzspeed; CScrollBar m_scrsladd;
放到简单类型成员变量上面,问题解决。
堆栈破坏错误HEAP CORRUPTION DETECTED,一般是向变量写数据时,越过了变量占用内存造成,比如越过了字符数组的0结束符位置,多写入些字符,就会造成。
但是本例里,并不是这样。我的对话框里没有字符数组,只有滚动条和简单类型成员,所以结论就是在消息触发的函数里定义对话框是有限制的,对成员的位置布局有限制,遇到这类限制,VC++就不稳定!
为什么有这类限制?和底层处理有关。心得就是:环境说你不行,你就不行,改成环境能允许的,你才行。这也是软件开发的本质,事情不是上层程序员说了算,要能适应环境。