我需要一个与Windows线程(WEC7)相关的说明。请考虑以下示例代码。我想知道代码中是否有任何内存泄漏。
在代码片段中,MyThread1在堆中创建内存并传递给MyThread2,并在那里清除分配的内存。
DWORD WINAPI MyThread2(LPVOID lpVoid)
{
int* b = (int*)lpVoid;
int c = *b;
free(lpVoid);
return 0;
}
DWORD WINAPI MyThread1(LPVOID lpVoid)
{
int count =100;
while(count)
{
int* a = NULL;
a= (int*)malloc(sizeof(int));
*a = count;
CloseHandle(CreateThread(NULL, 0, MyThread2,(LPVOID)a, 0, NULL));
count --;
}
return 0;
}
int main()
{
CreateThread(NULL, 0, MyThread1,NULL, 0, NULL);
// wait here until MyThread1 exits.
return 0;
}
答案 0 :(得分:2)
如果CreateThread()
中的MyThread1()
无法创建新主题,则您显示的代码将会泄漏。您没有检查该条件,因此MyThread1()
可以释放它分配的内存。除此之外,由于您在一个线程中分配内存并在另一个线程中释放它,因此请确保使用编译器RTL的多线程版本。
答案 1 :(得分:1)
没有内存泄漏。 malloc
的来电与free
的来电相匹配。
当线程1完成并且程序关闭时,某些线程2实例可能尚未开始运行。但在那时,系统回收了记忆。
你没有为线程1调用CloseHandle
,但我猜这不是真正的代码。在实际代码中,您肯定必须捕获线程1的句柄,以便您可以等待它。
HANDLE hThread1 = CreateThread(NULL, 0, MyThread1,NULL, 0, NULL);
WaitForSingleObject(hThread1, INFINITE);
CloseHandle(hThread1);
请注意,我已采用您的错误检查政策,以简化说明。当然,在实际代码中,您可以为所有API调用添加错误处理。