关闭程序后,子线程未正确退出引出的内存泄露问题

 

 

 

内存泄露信息如下:

 

 f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {239} normal block at 0x003AADA8, 46 bytes long.
 Data: <| Ox            > 7C D9 4F 78 0E 00 00 00 0E 00 00 00 01 00 00 00
f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {237} normal block at 0x003AAD38, 48 bytes long.
 Data: <| Ox            > 7C D9 4F 78 0E 00 00 00 0F 00 00 00 01 00 00 00
f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp(306) : {232} client block at 0x003AACB8, subtype c0, 68 bytes long.
a CWinThread object at $003AACB8, 68 bytes long

 

 

经查资料:

strcore.cpp   泄露  是由于CString 引起的

 

thrdcore.cpp  是由于线程未能正确退出引起的。

 

问题是,我仔细检查了cstring的使用 凡是 GetBuffer的地方 都release掉了 ,应该没问题了

 

那最主要因素还是线程的原因。

 

分析:

关闭对话框,此时执行对话框析构函数,在析构函数末尾,会强制关闭子线程函数。

问题就出现在这里了:

由于,子线程是强制关闭的, 所以子线程未执行完毕就被关闭了,因此,子线程所用到的资源未能及时释放,由此引起了内存泄露

 

解决方法:  在关闭主程序后,不要强制关闭子线程,而是让他也自动关闭

 

 

第一步: 建立全局变量

 

 

BOOL g_bIsValid=FALSE;    // 子线程循环条件

HANDLE g_hEvent=NULL;  // Event事件

 

 

第二步: 在创建线程前,创建一个无信号的event事件

 

g_hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

 

 

第三步: 设置子线程循环条件,并在循环结束后,设置EVENT事件

 

 while (g_bIsValid)
 {

     ...
 }

 SetEvent(g_hEvent);

 

第四步: 在主程序的析构函数中,修改g_bIsValid 并调用WaitForSingleObject(g_hEvent,INFINITE); 等待事件状态改变,而不是直接关闭程序。若事件状态改变 ,则意味 子线程函数跳出循环,可以正常退出

因此,若直接关闭程序,则子程序可能还没有正确退出,所以必须要调用WaitForSingleObject(g_hEvent,INFINITE); 以保证子线程正确退出

 

 g_bIsValid=FALSE;

 WaitForSingleObject(g_hEvent,INFINITE);
 CloseHandle(g_hEvent);

 

 

 

参考资料:

http://blog.csdn.net/linlianghui2004/article/details/3938693

 

 

 

你可能感兴趣的:(调试错误信息)