我创建了一个用户界面线程用来定时从互联网获取数据并通知主线程更新显示,在程序运行期间一切正常,可是在程序退出时会出现内存泄漏:
Detected memory leaks!
Dumping objects ->
F:\projsrc\LuFengChart\UpdateShipPosThread.cpp(18) : {58316} client block at 0x086B6750, subtype 0, 212 bytes long.
a CUpdateShipPosThread object at $086B6750, 212 bytes long
Object dump complete.是不是因为主线程结束时没有结束用户界面线程所致,但怎么在关闭主程序时终止子线程呢?请高手不吝赐教。

解决方案 »

  1.   

    在创建子线程时你会保留它的句柄,那么可以在结束时调用
    BOOL GetExitCodeThread( 
    HANDLE hThread, 
    LPDWORD lpExitCode); 
    函数得到子线程退出码,在调用
    VOID ExitThread( 
    DWORD dwExitCode); 
    或TerminateThread函数来终止子线程
      

  2.   

    用线程同步措施。比如创建一个event,让子线程过一段时间查询一次这个event(用WaitForSingleObject,时间参数设为0),如果返回WAIT_OBJECT_0,就调用AfxEndThread来结束自己,否则继续执行。主线程方面,当用户退出时SetEvent把这个对象设为signal状态。
      

  3.   

    webber84(***闭关修炼中***) :你的方法在我这种情况好象不行,子线程定时要做一个很费时的访问网络操作,如果正巧这时退出主程序,子线程将来不及检测enent并结束自己。 xiaoqingyu(小青鱼) :你的方法我试过了,可不知为什么调试程序时结束不了程序,程序总是在执行到 VOID ExitThread( DWORD dwExitCode); 之后“go”的工具条变灰,按“F5”也没有效果。如果以Execute执行,程序能结束,这是怎么回事?
      

  4.   

    ExitThread是用来结束调用线程的,跟子线程没什么关系。TerminateThread倒是可以用,但这样子线程没有机会执行清理操作,可能有资源泄漏。不过反正你的程序都要退出了,windows总会替你处理这些资源,你根据你的情况办吧
      

  5.   

    用TerminateThread结束线程的确又出现了讨厌的“memory leaks!”,有没有什么好的办法?
      

  6.   

    要防止memory leak应该很简单,在TerminateThread以后把你的CUpdateShipPosThread对象delete掉就行了。
      

  7.   

    你看看F:\projsrc\LuFengChart\UpdateShipPosThread.cpp line18 到底是什么, 这个文件应该是你的,泄露的就是这里分配的内存。然后检查这里分配的内存在那里释放,也许就可以解决问题。
      

  8.   

    同意stonespace.
    你雙擊這地方.就是你出問題的地方.找到這裡
      

  9.   

    双击之后程序找到下边这行
    IMPLEMENT_DYNCREATE(CUpdateShipPosThread, CWinThread)
    这里的内存泄漏怎么解决?
      

  10.   

    可能是因为你的UI线程异常退出的缘故,所以你UI线程的ExitInstance没有调用,CUpdateShipPosThread对象没有被删除,你试试在主线程退出前,向UI线程post一个WM_QUIT消息并等待它退出后再退出。