Windows线程创建过程中的内存管理
Memory management during Windows Thread Creation
我需要一个关于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调用添加错误处理。
相关文章:
- 当vector是tje全局变量时,c++中vector的内存管理
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- C++将字符串传递给 C 库以进行内存管理
- 从函数返回时C++内存管理
- 函数指针和 lambda 的内存管理
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- C++中的内存管理
- C和C++中的内存管理有什么区别
- 字符 * 未从重载运算符或内存管理问题正确返回
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- 底层指针和内存管理
- 智能指针,避免使用QNetworkAccessManager时进行手动内存管理
- c++中的内存管理问题
- 使用矢量时的内存管理
- 循环和内存管理中的指针算术C++?
- C++堆栈内存管理问题
- C 内存管理中的课程如何管理 - 研究
- 不可变数据模型的内存管理
- C++ 使用数组初始化时的 STL 向量内存管理
- SFML 纹理内存管理