小弟新建了一个MFC对话框工程,在类中添加了静态函数:
static UINT CALLBACK ThreadProc(LPVOID);
一个线程指针:
CWinThread* pThread;
一个全局变量用于控制线程退出:
static BOOL bClose;对话框在初始化时,添加如下代码:
bClose=false;
pThread=new CWinThread;
析构函数的代码如下:
CMThreadDlg::~CMThreadDlg()
{
    bClose=true;
    WaitForSingleObject(pThread->m_hThread,INFINITE);

    if(pThread)
delete pThread;

}
当单击按钮时,启动线程:
pThread=AfxBeginThread(AFX_THREADPROC(ThreadProc),NULL);
pThread->m_bAutoDelete=false;
线程函数体如下:
UINT CMThreadDlg::ThreadProc(LPVOID parm)
{
int a=0;
while(!bClose)
{
a++;
}
AfxEndThread(500);
return 0;
}
请问各位大侠,当线程运行之后,关闭对话框,如何防止内存泄露。

解决方案 »

  1.   

    m_bAutoDelete已经为false了,这样,需要在结束时手动删除pThread了。
      

  2.   

    当线程正在运行时,那句   if(pThread) delete   pThread; 是执行的,但还要内存泄露呀,怎么回事呀?
      

  3.   

    我都是在线程里面释放资源, 在对话框退出的时候waitfor线程的退出才退出,而在OnClose()的时候设置线程的退出条件. 看不大懂lz的代码- -+
      

  4.   

    需要重载一个CWinThread类,定义成用户界面线程吗?
      

  5.   

    你有很多问题,
    首先,你的变量 bClose要这样声明
    static volatile BOOL bClose= false ;(volatile 和static 的顺序lz在好好确定一下 )否则很可能代码优化后这个变量失效 ~~
    其次,pThread=AfxBeginThread(AFX_THREADPROC(ThreadProc),NULL); 
         pThread-> m_bAutoDelete=false; 
         的顺序最好交换或者先暂停线程,设置好所有选项后再启动线程,这是一种好习惯!
    最后,AfxEndThread(500);的调用好象有点多余吧,直接return 500不就好了吗?
    至于内存为什么会泄露,我建议lz还是好好查看其他地方吧,单从线程来看应该没有问题的,Debug窗口应该有提示的啊我对MFC不是很熟悉,反正没有什么好感,还是Win32 API直接 ,delphi和C++ Builder用的VCL都比MFC高明很多~~
      

  6.   

    终于解决了,听楼上一言,胜过十年书呀。现在把正确的代码展示如下:
    在对话框类里添加变量:protected:
        CWinThread* m_pUIThread;
        HANDLE handle;添加回调函数声明:static UINT CALLBACK ThreadProc(LPVOID lParam);添加全局变量:static volatile BOOL bClose;在对话框实现体中添加按钮单击消息体,回调函数体和析构函数:void CMyThreadDlg::OnButton1()
    {
    bClose=false;
    m_pUIThread=AfxBeginThread(AFX_THREADPROC(ThreadProc),THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);
    handle=m_pUIThread->m_hThread;
    m_pUIThread->ResumeThread();
    }
    UINT CMyThreadDlg::ThreadProc(LPVOID lParam)
    {
    int   a=0; 
    while(!bClose) 

    a++; 


    return  500; }
    CMyThreadDlg::~CMyThreadDlg()
    {
    bClose=true;
    if(WaitForSingleObject(handle,0)==WAIT_TIMEOUT)
    {
       WaitForSingleObject(handle,INFINITE);
       
    }

    }