c ++ - Programnedbrud (bad\_alloc) fordi task\_group lækker reserveret hukommelse

Indlæg af Hanne Mølgaard Plasc

Problem



EDIT: Dette var oprindeligt tænkt som et fragmenteringsproblem, her er en mere præcis erklæring om problemet.


Jeg har denne perfekt fungerende kode:


while(true)
{
    Job job = provider.NextJob();
    if (job.get() == NULL)
    {
        Result jobResult = job.Run();
        provider.ProcessJobResult(jobResult);       
    }
    else
    break;
}


Jeg genudfører det: (oprindeligt var der flere tråde, men en enkelt tråd manifesterer stadig problemet)


JobProvider provider;
Concurrency::task\_group taskGroup;

std::function<void ()> processingJob = [&provider, &taskGroup, &processingJob]
{
    Job job = provider.NextJob();
    if (job.get() == NULL)
    {
        Result jobResult = job.Run();
        provider.ProcessJobResult(jobResult);
        taskGroup.run(jobCode);
    }
};

taskGroup.run(jobCode);
taskGroup.wait();


Denne kode går i stykker på grund af ingen hukommelse efter et stykke tid.
For at analysere hukommelsesplads, brugte jeg:



  1. funktion \_CrtDumpMemoryLeaks() i crtdbg.h - hvilket viser, at der ikke er lækager, hvis antallet af jobs er lille nok til at lade applikationen fuldføre og afslutte.

  2. denne profiler: http://hashpling.org/asm/
    Dette er, hvad profiler viser:
    Profiler output



Rød betyder begået, Gult reserveret og Grønt, som var helt forbrugt, betyder gratis.
Tråd, der taskGroup skaber, gør ikke rent reserveret hukommelse. Kan nogen sige hvorfor? [6]

Bedste reference