Windows线程创建过程中的内存管理

Memory management during Windows Thread Creation

本文关键字:内存 管理 过程中 线程 创建 Windows      更新时间:2023-10-16

我需要一个关于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;
}

如果MyThread1()中的CreateThread()未能创建新线程,则您所展示的代码将会泄漏。您没有检查该条件,因此MyThread1()可以释放它分配的内存。除此之外,由于您在一个线程中分配内存并在另一个线程中释放内存,因此请确保您使用的是编译器RTL的多线程版本。

没有内存泄漏。对malloc的调用匹配对free的调用。

当线程1结束并且程序关闭时,一些线程2实例可能还没有开始运行。但是在这个点上,系统会回收内存。

你不调用CloseHandle线程1,但我想这不是真正的代码。在实际代码中,您肯定必须捕获线程1的句柄,以便等待它。

HANDLE hThread1 = CreateThread(NULL, 0, MyThread1,NULL, 0, NULL);
WaitForSingleObject(hThread1, INFINITE);
CloseHandle(hThread1);

请注意,我采用了您的省略错误检查的策略,以简化说明。当然,在实际代码中,您将为所有API调用添加错误处理。