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来的实在
留言