我在动态库的导出函数里创建了一个界面线程,该动态库隐式链接到主程序。当程序退出时,我在CXXXView::OnDestroy()里调用了动态库的清理函数,该函数给界面线程PostThreadMessage一个消息,通知它释放new出的对象。消息响应函数里调用了WaitForMultipleObjects函数等待几个工作者线程结束,然后进行释放操作。现在发现消息响应函数执行到WaitForMultipleObjects以后,线程好像就结束了,以致该函数里后面的释放操作都没有机会执行,引起内存泄露。跟踪发现执行进入CDllApp::ExitInstance()中时,该界面线程已经结束了,而我之前并没有任何结束该线程的操作。不知道什么问题,恳请高人赐教!
解决方案 »
- 为何客户端在connect失败后竟然会触发FD_CONNECT消息!!!
- 大家看看,这种情况怎么办..PCI 的 SAA7130HL
- IHTMLxxxx,ishellwin接口对象的生存期,内存泄露的问题,高手来看看
- 如何获取变量类型及void指针中保存的指针指向什么类型的变量???
- 如何在访问存在于网络中另一台机器的ACCESS数据库
- 请各位高手指教:如何通过RS232读取keithley的串口数据
- Who have MSDN6.0(Chinese)?
- 谁能帮帮我!真有些绝望了...
- 怎么控制Combo box的弹出方向(一般向下,怎么使它向上?)
- 求一个 阴影 算法,Fireworks,PS中都有阴影滤镜,想知道这个阴影的算法?
- StartPage和EndPage之间,为什么要有SaveDC和RestoreDC?
- VS 2010的单文档菜单栏修改ID后灰色
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消息],而我之前并没有任何结束该线程的操作。