Сбой приложения (bad_alloc) из-за утечки зарезервированной памяти в группе задач - PullRequest
0 голосов
/ 20 марта 2012

РЕДАКТИРОВАТЬ: изначально предполагалось, что это проблема фрагментации, вот более точное изложение проблемы.

У меня есть этот отлично работающий код:

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

Я переопределяю это: (изначально было несколько потоков, но проблема возникает в одном потоке)

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();

Этот код вылетает из-за отсутствия памяти через некоторое время. Для анализа памяти я использовал:

  1. функция _CrtDumpMemoryLeaks() в crtdbg.h - показывает, что утечек нет, если количество заданий достаточно мало, чтобы приложение могло завершиться и выйти.
  2. этот профилировщик: http://hashpling.org/asm/ Вот что показывает профилировщик: Profiler output

Красный означает преданный, Желтый зарезервированный, а Зеленый, который был полностью поглощен, означает свободный. Потоки, которые taskGroup создает, не очищают зарезервированную память. Кто-нибудь может сказать почему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...