首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >疑似_beginthread内存泄漏

疑似_beginthread内存泄漏
EN

Stack Overflow用户
提问于 2018-03-30 01:16:49
回答 1查看 77关注 0票数 0

所以,我有一些问题,我怀疑是内存泄漏,为了测试,我写了这个小代码。通过注释以下行:

代码语言:javascript
复制
printf("Calc index: %d\n", ArrLength);

代码运行良好。但是当我取消对它的注释时,程序在几千个线程之后崩溃了。当我使用try/catch时,程序在try函数中崩溃了。有谁能帮我吗?

代码语言:javascript
复制
#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 started\n");
    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: %d\n", 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;
}
EN

回答 1

Stack Overflow用户

发布于 2018-03-30 01:29:25

好吧,让我们做一些计算。您的t结构每个实例有40020个字节。您确实分配了它1M次,这导致总共分配了大约40 Gb。这并不是所需的全部内存,因为每个线程都不是免费的。默认情况下,Windows为每个线程分配1Mb的堆栈,这为您提供了1 Tb (1TB)的内存,仅让线程存活即可。

因此,总内存大小约为1040 Gb。你真的打算这么做吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49561787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档