我在动态库的导出函数里创建了一个界面线程,该动态库隐式链接到主程序。当程序退出时,我在CXXXView::OnDestroy()里调用了动态库的清理函数,该函数给界面线程PostThreadMessage一个消息,通知它释放new出的对象。消息响应函数里调用了WaitForMultipleObjects函数等待几个工作者线程结束,然后进行释放操作。现在发现消息响应函数执行到WaitForMultipleObjects以后,线程好像就结束了,以致该函数里后面的释放操作都没有机会执行,引起内存泄露。跟踪发现执行进入CDllApp::ExitInstance()中时,该界面线程已经结束了,而我之前并没有任何结束该线程的操作。不知道什么问题,恳请高人赐教!

解决方案 »

  1.   

    你的问题说的有点饶。我的理解:
    1.  exe.exe 隐式链接 dlla.dll
    2. dlla.dll 导出了函数dllaFuna,dllFunB函数。dllaFuna创建了一个界面线程dllaThreadA。dllaFunB是清理函数(还对?)
    4. 当准备exe.exe退出,在CXXXView::OnDestroy()里调用了动态库的清理函数dllaFunB,该函数给界面线程(及主线程)PostThreadMessage一个消息(我们认为是exeMsgA),通知它释放new出的对象。[问题:这个new出来的对象指什么?]
    5. exeMsgA的相应函数调用了WaitForMultipleObjects函数等待几个工作者线程结束,然后进行释放操作。如果上面分析正确:
    现在发现消息响应函数执行到WaitForMultipleObjects以后,线程好像就结束了[这里的线程是指谁?主线程?dllaThreadA?我觉得上面的操作不会让这两个线程退出。],以致该函数里后面的释放操作都没有机会执行,引起内存泄露。跟踪发现执行进入CDllApp::ExitInstance()中时,该界面线程已经结束了[在线程退出的地方加个log,看看是不是正常退出的,哪里退出来的。是不是你的界面线程什么时候收到了WM_QUIT消息],而我之前并没有任何结束该线程的操作。
      

  2.   

    线程是被外部强行结束了,不知道大家都是怎么在dll里面使用线程的。
      

  3.   

    让线程先退出,然后再unload dll,否则会挂球~~