程序在debug版不会当,但是release版会当,有哪些原因?

解决方案 »

  1.   

    问题是在某些环境没问题,比如简体2k、xp、繁体xp home edition不会当,只在在少数繁体xp professional版下会当。
      

  2.   

    http://blog.csdn.net/bobob/archive/2005/12/23/559877.aspx
      

  3.   

    I. 内存分配问题
    1. 变量未初始化。
    为debug中会自动给变量初始化found=FALSE,而在release版中
    则不会。所以尽可能的给变量、类或结构初始化。
    2. 数据溢出的问题
    如:char buffer[10];
    int counter;
    lstrcpy(buffer, "abcdefghik");
    在debug版中buffer的NULL覆盖了counter的高位,但是除非counter>16M,什么问题也没
    有。但是在release版中,counter可能被放在寄存器中,这样NULL就覆盖了buffer下面
    的空间,可能就是函数的返回地址,这将导致ACCESS ERROR。
    3. DEBUG版和RELEASE版的内存分配方式是不同的 。如果你在DEBUG版中申请
    ele 为 6*sizeof(DWORD)=24bytes,实际上分配给你的是32bytes(debug版以32bytes
    为单位分配), 而在release版,分配给你的就是24bytes(release版以8bytes为单位
    ),所以在debug版中如果你写ele[6],可能不会有什么问题,而在release版中,就有A
    CCESS VIOLATE。
    II. ASSERT和VERIFY
    1. ASSERT在Release版本中是不会被编译的。 
    假如你在这些语句中加了程序中必须要有的代

    比如
    ASSERT(pNewObj = new CMyClass);
    pNewObj->MyFunction();
    这种时候Release版本中的pNewObj不会分配到空间
    所以执行到下一个语句的时候程序会报该程序执行了非法操作的错误。这时可以用VERIFY 
    III. 参数问题:
    自定义消息的处理函数,必须定义如下:
    afx_msg LRESULT OnMyMessage(WPARAM, LPARAM);
    返回值必须是HRESULT型,否则Debug会过,而Release出错 
    IV. 内存分配
    保证数据创建和清除的统一性:如果一个DLL提供一个能够创建数据的函数,那么这个D
    LL同时应该提供一个函数销毁这些数据。数据的创建和清除应该在同一个层次上。
    V. DLL的灾难
    人们将不同版本DLL混合造成的不一致性形象的称为 “动态连接库的地狱“(DLL Hell) 
    如果你的程序使用你自己的DLL时请注意:
    1. 不能将debug和release版的DLL混合在一起使用。debug都是debug版,releas
    e版都是release版。
    解决办法是将debug和release的程序分别放在主程序的debug和release目录下
    2. 千万不要以为静态连接库会解决问题,那只会使情况更糟糕
    VI. RELEASE板中的调试 :
    1. 将ASSERT() 改为 VERIFY() 。找出定义在"#ifdef _DEBUG"中的代码,如果
    在RELEASE版本中需要这些代码请将他们移到定义外。查找TRACE(...)中代码,因为这些
    代码在RELEASE中也不被编译。 请认真检查那些在RELEASE中需要的代码是否并没有被便
    宜。
    2. 变量的初始化所带来的不同,在不同的系统,或是在DEBUG/RELEASE版本间
    都存在这样的差异,所以请对变量进行初始化。
    3. 是否在编译时已经有了警告?请将警告级别设置为3或4,然后保证在编译时没
    有警告出现.
    VII. 将Project Settings" 中 "C++/C " 项目下优化选项改为Disbale(Debug)。编
    译器的优化可能导致许多意想不到的错误,请参考http://www.pgh.net/~newcomer/deb
    ug_release.htm
    1. 此外对RELEASE版本的软件也可以进行调试,请做如下改动:
    在"Project Settings" 中 "C++/C " 项目下设置 "category" 为 "General" 并且将"D
    ebug Info"设置为 "Program Database"。
    在"Link"项目下选中"Generate Debug Info"检查框。
    "Rebuild All"
    如此做法会产生的一些限制:
    无法获得在MFC DLL中的变量的值。
    必须对该软件所使用的所有DLL工程都进行改动。
      

  4.   

    那是因为析构次序可能有问题,你在OnDestroy函数里写过程序吗?贴出来看看。
    也可尝试把你写的程序段放在调用父类的OnDestroy函数的前面。
      

  5.   

    这个问题一个典型的例子就是在使用MSCOMM控件的时候,比如在一对话框的OnDestroy函数里有下面的语句:
    void CXXXDlg::OnDestroy()
    {
    CDialog::OnDestroy();
    m_SerialCOM.SetPortOpen(FALSE); //m_SerialCOM为MSCOMM控件的一个实例
    }上面的程序在退出的时候会当,改正的方法如下:
    void CXXXDlg::OnDestroy()
    {
    m_SerialCOM.SetPortOpen(FALSE); //m_SerialCOM为MSCOMM控件的一个实例
    CDialog::OnDestroy();
    }或干脆不调用SetPortOpen函数,控件自己会释放自己的资源的,显示调用只是为了让程序看起来更合理些。