我这样创建了一个界面线程。 
它继承于CWinThread 
class CMyUIThread : public CWinThread 
///// 然后我这样开启线程的: 
CMyUIThread* pThread = new CMyUIThread; 
pThread->CreateThread(); 然后在线程的ExitInstance里面我做了一些释放线程中资源的操作。但是我发现ExitInstance不会被调用,所以我手动发送WM_QUIT消息给线程。 
pThread->PostMessage(WM_QUIT, 0, 0);
然后在ExitInstance中 我用断点跟了发现在AfxEndThread里面,他调用了pThread->Delete();
这个操作是不是已经删除了我new出来的Thread对象?我不用显式的调用delete删除了? 

解决方案 »

  1.   

    new出来的东西,都是需要delete的
    你就是把所有的东西都释放了,这个线程对象没有被释放啊
      

  2.   

    一般情况下,new和delete都是需要一一对应的啊!
      

  3.   

    不过它默认的Delete()方法里面有一句
    delete this;
    那我就不用delete了吧我想,不然就重复删除了。
      

  4.   

    pThread->Delete(); 对应的是 pThread->CreateThread(); 这个不会释放new出来的空间!
    CMyUIThread* pThread = new CMyUIThread; 应该对应的 delete pThread; 这是释放new出来的空间!
      

  5.   

    你可以在调试状态下运行,然后正常关闭,看看输出窗口里面释放有dump
      

  6.   

    那我必须设置m_bAutoDelete为false屏蔽他delete this的操作。
    不然的话它自己调用Delete()以后,在我delete pThread的时候就会出异常。
      

  7.   

    当然没有,不信,你看看完了后,有没有内存泄漏。
    还是要delete pThread  
      

  8.   

    是不是你线程还没有结束,你就delete了?
      

  9.   

    现在的现象是我这样写:
    if ( pThread ) 

    pThread->PostMessage(WM_QUIT, 0, 0); 
    WaitForSingleObject(pThread->m_hThread, INFINITE); 
    delete pThread; 
    pThread = NULL; 
    }在delete pThread的时候抛出异常。
    我在前面设置pThread的m_bAutoDelete为false的时候就不会异常。
      

  10.   

    pThread->PostMessage(WM_QUIT, 0, 0); 
    改成:pThread->SendMessage(WM_QUIT, 0, 0); 试试!
      

  11.   

    pThread->PostMessage(WM_QUIT, 0, 0); 
    WaitForSingleObject(pThread->m_hThread, INFINITE); 这两句加起来和SendMessage差不多吧。它会等到线程结束的。
      

  12.   

    HANDLE handle = pThread->CreateThread();
    CloseHandle(handle);
    delete pThread; 
    好些是CreateThread后,如果线程不用了,必须调用CloseHandle释放资源!
      

  13.   

    CWinThread的CreateThread的返回值是BOOL。
      

  14.   

    进来聊啊~~,到底是怎么个delete的
      

  15.   

    是MFC的,我看成win32的了!
    http://www.vczx.com/tutorial/mfc/mfc8.php
    看看这个吧
      

  16.   

    多谢!了解了。
    引用:
    CWinThread::Delete的缺省实现是:如果本线程的成员函数m_bDelete为TRUE,则调用“C”运算符号delete销毁MFC线程对象自身(delete this),这将导致线程对象的析构函数被调用。若析构函数检测线程句柄非空则调用CloseHandle关闭它。通常,让m_bDelete为TRUE以便自动地销毁线程对象,释放内存空间(MFC内存对象在堆中分配)。但是,有时候,在线程结束之后(Win32线程已经不存在)保留MFC线程对象是有用的,当然程序员自己最后要记得销毁该线程对象。
      

  17.   

    感觉楼主的用法不得当
    继承CWinThread的方法一般多用于UI线程,
    分配线程创建窗体的时候用的,如果不是这种用途请使用工作线程。
    正确的做法是:
    构造一个窗体类CMyDlg
    //在CMyUIThread 的InitInstance函数内
    BOOL CMyUIThread::InitInstance()
    {
    m_pMainDlg = new CMyDlg;
    m_pMainDlg->Create(IDD_DIALOG_MAIN, CWnd::GetDesktopWindow());
    m_pMainDlg->ShowWindow(SW_SHOW);
    return TRUE;
    }
    //在ExitInstance()函数内
    int CMyUIThread::ExitInstance()
    {
    if(m_pMainDlg!=NULL)
    {
    delete m_pMainDlg;
        m_pMainDlg = NULL;
    }

    return CWinThread::ExitInstance();
    }