以前一直以为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,俺会继续加分、决不吝啬,谢啦!

解决方案 »

  1.   

    照理说,在Debug中写的一些不规范的代码,在Debug版本中没关系,但是在Release中则会报错
      

  2.   

    可能是初始化问题,release下编译器做了优化,把你没有初始化的变量初始化为0
      

  3.   

    回3楼:代码不是我写的,且很长,不好检查啊
    回4楼:你的意思是因为Release版的某些变量初始化为0,所以在一些ASSERT(p!=NULL)时就报错了?
    那么书上说“全局变量初始化而局部变量不初始化”在Release和Debug版上有不同表现了?那么请问COleControl中的h_Wnd在Debug为NULL怎么理解啊?昨天我有写了个控件,Debug时发现m_hWnd又为NULL了 :-(
      

  4.   

    MFC开发ACTIVEX控件,在容器中(比如应用程序)调用时,如果你的控件版本使用的是debug版的,你的应用程序最好是debug版的。
    如果你使用的控件版本是release版的,那么相应的调用程序也使用release版的,可以避免一些兼容问题。以上观点只是看到过,没有验证。祝你成功。
      

  5.   

    谢谢LS两位,代码里用了大量的new,delete和数组,估计Release版崩溃八成就是因为指针问题了,而Debug版不崩溃莫非是Debug里加了一些保护措施?关于m_hWnd为空的问题貌似有一些眉目了,在网上搜到把TSTCON32的design-mode去掉后m_hWnd就有值了,具体原理不清楚,莫非Release版默认是runtime-mode而Debug版默认是design-mode? 那么能在空间中更运行改模式吗?
      

  6.   

    debug 正常release出错通常都是代码编写风格不规范所致,比如数组下标越界使用,变量,数组,结构没有初始化,不规范的调用库函数等等。
    你说你在代码里有大量的new和delete,我估计就是这上面出问题了。在debug里分配内存的时候会比期望值多分配一些,比如你要分配32byte的内存,而在debug里实际会在32byte前多分配4byte、在32byte后也多分配4byte,填充为0xed,这是为了检查你有没有越界引用内存而特别设立的。如果编译器检测到所分配的内存单元前后4byte范围里的值不是0xed的话就会报错,这样就会提醒你代码里有bug。但是往往也有很多情况下编译器是检测不到的,这时debug下会正确,而到了release下就会出错了。
    还有一种情况是,debug在分配内存的时候会初始化为规则的0xcc或是0xcd,或者是其他的规则数据,而release则不会初始化,分配到的内存里原来是什么就是什么,那么如果你没有显示的初始化你的变量就开始用的话,在release里会出现不可预知的错误。