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

6f3726a0jw1ecsgwzfddcj20yg0ofady

最后修改日期:2015 年 9 月 21 日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。