windows核心编程中一致在建议使用_beginthreadex创建线程,而不是直接使用CreateThread,
一值对此抱有怀疑(或许程序猿都是这样,不到黄河不死心吧),于是写了个示例程序演示了使用CreateThread造成内存的影响
#include "stdafx.h"
#include <Windows.h>
#include <process.h>
unsigned int WINAPI Fun(LPVOID lparm)
{
int cout = 1000;
do
{
int* i = new int[10];
delete i;
} while (cout--);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD exitCode = 0;
int lparme = 10;
int count = 100;
//此处下断点查看内存使用情况
do
{
//HANDLE hThread = (HANDLE)_beginthreadex(NULL, NULL, Fun, &lparme, NULL, NULL);
HANDLE hThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)Fun, &lparme, NULL, NULL);
CloseHandle(hThread);
} while (count--);
//此处下断点查看内存使用情况,是否与调用前内存占用一致
getchar();
return 0;
}
调试程序,并使用任务管理器查看程序内存使用情况发现,直接使用CreateThread会导致一部分内存无法得到释放
这是因为当使用C++运行库函数时。会为主调线程分配并初始化一个——tiddata块
,由于未使用c++的_endthreadex来终止线程,数据块不会被销毁,导致内存泄露。
因此如果是编写C++程序,还是用C++自己的_beginthreadex来的实在

留言