我的程序是用EndDialog()退出的,片段大概如下:
UINT myThread()//些为全局函数
{
   ......
   myDlg->m_pLog = new CLog(...);
   myDlg->EndDialog();
   return true;
}
但执行一段时间后会报错提示某个地址不能读或不能写,于是我把其中一个new了的指针delete了,是在自己重写的EndDialog()里面释放的:
void CMyDlg::EndDialog(int nResult)
{
    CDialog::EndDialog(nResult);//这句放这里还是放最后面好呢?
    LogMsg("EndDialog()"); //此会用到下面释放的指针
     if(m_pLog != NULL) //m_pLog 是个CLog类的指针,作为CMyDlg的数据成员,记录日记用的
     {
        delete m_pLog;
        m_pLog = NULL; 
    }
    return;
}//(我在另一个程序里发现有这种用法但没出错,于是就试写重写EndDialog()了)但运行一段时间后还是出现像如下错误提示:
The instruction at "0x7c82f56b" referenced memory at "0x000000".The memory could not be read.或是:The instruction at "0x0016b0b8" referenced memory at "0x0016b0b8".The memory could not be written.
程序就此停了(我是在SQL Server的Job里运行的),但写完了所有日记。于是我加上onDestroy(),但却写了onDestroy()它里面的日记,而EndDialog(int nResult)里的LogMsg()却没有写上。
void CMyDlg::OnDestroy()
{
  CDialog::OnDestroy();//放这还是放后面好呢?
   LogMsg("onDestroy()");
  if(m_pLog != NULL)
   {
       delete m_pLog;
       m_pLog = NULL; 
   }
}我想请问大家,像这种情况怎么处理这些指针的释放?应该放在哪个位置,onDestroy()和EndDialog()两个在执行上有什么关系呢?我查过MSDN但没查到这些,请各位指教。

解决方案 »

  1.   

    你的代码让我糊涂了,我想编译器也一样:
    myDlg->m_pLog = new CLog(...); 
    你是创建了一个myDlg中m_pLog的实例,不知道在哪里创建了对话框窗口,创建的是myDlg的对话框窗口还是m_pLog的对话框窗口?还是二者?用EndDialog的话,对话框应该是DoModal()显示的?没看到创建的代码不好说。但是,CDialog::EndDialog(nResult);调用的是CMyDlg的基类函数,和CLog类又有什么关系?总之没搞懂CMyDlg和CLog两个类什么关系,父子窗口?
      

  2.   

    TO:Mackz 
    myDlg是CMyDlg类的指针,CLog是另一个类,用来写日志的,其中myDlg是从开始函数里传来的,忘写上了。TO:cnzdgs
    这点在我的机器上不能实现,我们都是在公司的UAT服务器上试的了,所以很麻烦的,自己用的机器没有数据,而且我们有服务器上也只是用.exe文件来跑的。谢谢各位的关注,同志们辛苦了。
      

  3.   

    void CMyDlg::EndDialog(int nResult) 

        CDialog::EndDialog(nResult);//这句放这里还是放最后面好呢? 
        LogMsg("EndDialog()"); //此会用到下面释放的指针 
        if(m_pLog != NULL) //m_pLog 是个CLog类的指针,作为CMyDlg的数据成员,记录日记用的 
        { 
            delete m_pLog; 
            m_pLog = NULL; 
        } 
        return; 
    }//(我在另一个程序里发现有这种用法但没出错,于是就试写重写EndDialog()了) 
    ----------------------------------------
    CDialog::EndDialog(nResult);应该放在最后,同样OnDestroy() 里面也要把基类的OnDestroy() 放到最后另外,调用EndDialog会产生WM_DESTROY消息,因此一般是在DIALOG的WM_CLOSE里面调用EndDialog,WM_DESTROY消息里面完成清理工作。