所以,我怀疑内存泄漏有一些问题,以便测试我写了这个小代码。通过评论以下行:
printf("Calc index: %dn", ArrLength);
代码运行良好。但是,当我删除它时,该程序在数千个线程后崩溃了。当我使用try/catch时,该程序刚刚在尝试函数中崩溃。谁能在这里帮助我?
#include "stdafx.h"
#include <process.h>
#include <iostream>
#include <mutex>
#include <windows.h>
using namespace std;
typedef struct {
int StartNode;
int EndNode;
int GangID;
int MemberID;
int ArrLength;
int arr[10000];
}t;
t *arg;
mutex m;
void myFunc(void *param) {
m.lock();
printf("Calculate thread startedn");
t *args = (t*)param;
int StartNode = args->StartNode;
int EndNode = args->EndNode;
int GangID = args->GangID;
int MemberID = args->MemberID;
int ArrLength = args->ArrLength;
printf("Calc index: %dn", ArrLength);
free(args);
m.unlock();
}
int main()
{
for (int i = 0; i < 1000000; i++)
{
HANDLE handle;
arg = (t *)malloc(sizeof(t));
arg->StartNode = 2;
arg->EndNode = 1;
arg->GangID = 1;
arg->MemberID = 1;
arg->ArrLength = 5;
for (int j = 0; j < 10000; j++)
{
arg->arr[j] = j;
}
handle = (HANDLE)_beginthread(myFunc, 0, (void*)arg);
}
cin.get();
return 0;
}
好吧,让我们进行一些计算。您的t
结构每个实例具有40020字节。您确实分配了100万次,总共分配了约40 GB。这并不是所需的所有内存,因为每个线程不是免费的。默认情况下,Windows将每个线程分配1MB堆栈,从而为您提供1 TB(一个TBYTE(的内存,只需让线程实时即可。
因此,总存储量大约是1040 GB。您真的打算吗?