你在debug版编译时,打开/W4开关,看看有哪些警告信息,逐条解决,再到Release下编译运行看看.

解决方案 »

  1.   

    还有一个可能是使用delete来删除已被删除的指针
      

  2.   

    http://www.csdn.net/Expert/FAQ/FAQ_Index.asp?id=1760
      

  3.   

    http://www.csdn.net/expert/topic/712/712974.xml
      

  4.   

    通常DEBUG下能用,但RELEASE下不能用的原因有下列:1、变量没有初始化,在DEBUG下是自动初始化的。
    2、分配的内存没有置0,例如 char *pchBuff = new char[1024];
    ZeroMemory(pchBuff,sizof(pchBuff));在没有初始化的情况下,比较内存,DEBUG下是成功的,RELEASE下就是随机的了。
    3、参数传递时,忽略了变量的生存周期。这也是往往DEBUG下能运行,而RELEASE下不能运行的。你出现的问题可能就是这个原因。例如:  Cxxxxx::Dealsome()
    {
       int nTemp = 101*1024;
       AfxBeginThread(DoThread,(LPVOID)&nTemp);
    }这段代码在DEBUG下运行正常,但到了RELEASE下就会随机的错误,为什么?因为DoThread()函数是在另一个线程中运行的,那个函数运行的时候,局部变量nTemp的地址已经失效了,当然是非法操作了,WINDOWS API中有很多函数的返回值都是临时的,在MSDN中都有警告,不能保存下来使用,例如:CMenu* GetSubMenu( int nPos ) const;Return ValueA pointer to a CMenu object whose m_hMenu member contains a handle to the pop-up menu if a pop-up menu exists at the given position; otherwise NULL. If a CMenu object does not exist, then a temporary one is created. The CMenu pointer returned should not be stored.这样的函数,如果你在DEBUG中使用,有时是正常的,在RELEASE中使用偶尔也能正确,看了我上边的解释,你就明白为什么了。我想,DEBUG下能运行,可能是因为nTemp变量地址失效以前,线程函数已经完成运行退出了,而RELEASE下,可能在线程函数开始运行的时候,nTemp地址已经失效了,因为局部变量在堆栈中分配的,函数返回以后,这个堆栈也就弹出了。变量相应的也被销毁了,原来的那个地址也就无意义了。