【发布时间】:2021-11-10 10:32:39
【问题描述】:
我有一个示例 C++ 程序如下:
#include <windows.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
void * pointerArr[20000];
int i = 0, j;
for (i = 0; i < 20000; i++) {
void * pointer = malloc(131125);
if (pointer == NULL) {
printf("i = %d, out of memory!\n", i);
getchar();
break;
}
pointerArr[i] = pointer;
}
for (j = 0; j < i; j++) {
free(pointerArr[j]);
}
getchar();
return 0;
}
当我使用 Visual Studio 32 位 Debug 运行它时,它将运行以下结果:
程序在内存不足之前可以使用近 2Gb 的内存。
这是正常行为。
但是,当我在for 循环中添加代码以启动线程时,如下所示:
#include <windows.h>
#include <stdio.h>
DWORD WINAPI thread_func(VOID* pInArgs)
{
Sleep(100000);
return 0;
}
int main(int argc, char* argv[])
{
void * pointerArr[20000];
int i = 0, j;
for (i = 0; i < 20000; i++) {
CreateThread(NULL, 0, thread_func, NULL, 0, NULL);
void * pointer = malloc(131125);
if (pointer == NULL) {
printf("i = %d, out of memory!\n", i);
getchar();
break;
}
pointerArr[i] = pointer;
}
for (j = 0; j < i; j++) {
free(pointerArr[j]);
}
getchar();
return 0;
}
结果如下:
内存仍然只有 200Mb 左右,但函数 malloc 将返回 NULL。
谁能帮助解释为什么程序在内存不足之前不能使用高达 2Gb 的内存?
是不是说创建这么多线程会导致内存泄漏?
在我的实际应用程序中,当我创建大约 800 个线程时会发生此错误,“内存不足”时的 RAM 内存约为 300Mb。
【问题讨论】:
-
不确定这是否有帮助,但 CreateThread 文档说“进程可以创建的线程数受可用虚拟内存的限制。默认情况下,每个线程都有 1 兆字节的堆栈空间。”跨度>
-
我想知道是否有任何工具可以测量并显示上面创建的线程导致内存不足
-
你确定看懂任务管理器显示的图吗?
-
@IInspectable,不确定。但是我认为
CreateThread分配的一些隐藏内存/虚拟内存不会显示在任务管理器中,对吗?
标签: c++ windows multithreading memory malloc