内存泄露信息如下:
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);