以前一直以为Debug就是比Release版多了一些调试符号和堆申请链表之类,昨天调试Activex控件却把我彻底搞晕了....症状1:Debug版的不管跑多长时间都不会报错,不过运行期间内存轻微上涨,估计有内存泄露;而Release版跑一会儿就会出现“Access violation reading location”异常,断点在_free_base中的#endif /* CRTDLL */
else // __active_heap == __SYSTEM_HEAP
#endif /* _WIN64 */
{
retval = HeapFree(_crtheap, 0, pBlock);
if (retval == 0)
{
errno = _get_errno_from_oserr(GetLastError());
}
}
症状2:这个就更奇特了在IE中调用这个控件。如果是Release版<OBJECT></OBJECT>标签可以出现在任何位置而不报错,但是Debug版的必须把<OBJECT></OBJECT>放在<TABLE></TABLE>标签中,否则调用this->GetDC()时就会因为COleControl类的m_hWnd指针为NULL而报错昨天折腾了一天,快疯掉了,请各位帮忙解释一下这个异灵事件吧,如果能真能在各位的启发下解决Release版的Bug,俺会继续加分、决不吝啬,谢啦!
else // __active_heap == __SYSTEM_HEAP
#endif /* _WIN64 */
{
retval = HeapFree(_crtheap, 0, pBlock);
if (retval == 0)
{
errno = _get_errno_from_oserr(GetLastError());
}
}
症状2:这个就更奇特了在IE中调用这个控件。如果是Release版<OBJECT></OBJECT>标签可以出现在任何位置而不报错,但是Debug版的必须把<OBJECT></OBJECT>放在<TABLE></TABLE>标签中,否则调用this->GetDC()时就会因为COleControl类的m_hWnd指针为NULL而报错昨天折腾了一天,快疯掉了,请各位帮忙解释一下这个异灵事件吧,如果能真能在各位的启发下解决Release版的Bug,俺会继续加分、决不吝啬,谢啦!
解决方案 »
- 谁有用VC6.0写的UDP协议,每隔1s或者几秒钟就接收一次数据的源码啊?
- VC里用ShellExecute时的最后一个参数
- 我用数码相机拍摄的照片,2M多,用画图程序另存后,才800K,格式都是jpg的,怎么回事?
- 有限状态机在通信协议编程方面的应用
- 50分求教wmi2000下的问题
- 加图片
- 如何得到域登陆的域名,用户名
- CListCtrl里如何加入CComboBox的控件,实现每个Cell都能产生下拉似的ComboBox
- 从文件加载资源的问题
- -------到底是自己扩展MFC还是用Comctl32.dll的特性?-------
- CTreeCtrl的DeleteAllItems()问题
- IE缓存问题,高手进
回4楼:你的意思是因为Release版的某些变量初始化为0,所以在一些ASSERT(p!=NULL)时就报错了?
那么书上说“全局变量初始化而局部变量不初始化”在Release和Debug版上有不同表现了?那么请问COleControl中的h_Wnd在Debug为NULL怎么理解啊?昨天我有写了个控件,Debug时发现m_hWnd又为NULL了 :-(
如果你使用的控件版本是release版的,那么相应的调用程序也使用release版的,可以避免一些兼容问题。以上观点只是看到过,没有验证。祝你成功。
你说你在代码里有大量的new和delete,我估计就是这上面出问题了。在debug里分配内存的时候会比期望值多分配一些,比如你要分配32byte的内存,而在debug里实际会在32byte前多分配4byte、在32byte后也多分配4byte,填充为0xed,这是为了检查你有没有越界引用内存而特别设立的。如果编译器检测到所分配的内存单元前后4byte范围里的值不是0xed的话就会报错,这样就会提醒你代码里有bug。但是往往也有很多情况下编译器是检测不到的,这时debug下会正确,而到了release下就会出错了。
还有一种情况是,debug在分配内存的时候会初始化为规则的0xcc或是0xcd,或者是其他的规则数据,而release则不会初始化,分配到的内存里原来是什么就是什么,那么如果你没有显示的初始化你的变量就开始用的话,在release里会出现不可预知的错误。