Windows线程创建期间的内存管理

时间:2014-03-25 08:01:03

标签: c++ c windows winapi

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

2 个答案:

答案 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调用添加错误处理。