我看MSDN上说:“默认情况下,当 CWinThread 线程终止时,删除该线程对象。这意味着不能访问 m_hThread 数据成员,因为 CWinThread 对象不再存在。若要避免出现这种情况,请执行以下操作之一:
将 m_bAutoDelete 数据成员设置为 FALSE。这使 CWinThread 对象在线程终止后仍可以继续存在。然后可以在线程终止后,访问 m_hThread 数据成员。但是,如果使用此方法,就得销毁 CWinThread 对象,因为框架不会自动删除该对象。这是首选方法。 ”我写了一个简单的例子:
UINT ThreadFuncTest(LPVOID p)
{
for(int i=0;i<1000;i++)
{
;
}
return 0;
}void CButtonDlg::OnButton1() 
{
    CWinThread * pThread = AfxBeginThread(ThreadFuncTest, NULL);
    Sleep(5000);
    DWORD exitcode;
    if(!GetExitCodeThread(pThread->m_hThread, &exitcode))
    {
         if(pThread == NULL)
{
AfxMessageBox("null");
}
else
{
AfxMessageBox("not null");
}
    }
}
结果报 not null。既然线程对象已被删除,为何pThread 不是NULL?另外,我看THRDCORE.CPP里面:
void CWinThread::Delete()
{
// delete thread if it is auto-deleting
if (m_bAutoDelete)
delete this;
}
也说明默认是被delete的啊。请大侠指教!

解决方案 »

  1.   

    指针删除后不会自动被赋值为NULL的,使用完毕后需要自己把它赋值为NULL.
      

  2.   

    VC 并非把所有的工作都做了
    这个需要你自己重新设置 为NULL 的
      

  3.   

    :“默认情况下,当 CWinThread 线程终止时,删除该线程对象。这意味着不能访问 m_hThread 数据成员,因为 CWinThread 对象不再存在。
    ===============
    CWinThread被删除了,并不代表指针被置为NULL了,就像下面的代码:
    char *p=new char;
    delete p;
    此时p已经被删除,不能访问了。但是p并不等于NULL