Утечка памяти, вызванная неправильным использованием scoped_lock?

У меня есть утечка памяти, и я думаю, что это вызвано неправильным использованием scoped_lock (Boost). Однако мне не удается найти точную проблему, и я верю, что способ написания кода тоже не совсем правильный.

Код находится в этом классе там: http://taf.codeplex.com/SourceControl/changeset/view/31767

Основным важным методом является ThreadedLoop(). По сути, этот метод запускается в потоке и регулярно проверяет рыночные данные, которые будут загружены для Yahoo. Для каждого запаса (или другого) будет создан новый поток (для метода ExecuteNextRequest()), передав в качестве параметра указатель на строку, содержащую название запаса. Это единственное выделение памяти, которое я делаю, но оно освобождается в конце выполнения потока.

Мне также было бы интересно узнать, как можно улучшить этот код (конечно, я мог бы использовать пул потоков, но это еще не главное). Большое спасибо!

1 ответ

Решение

Я предлагаю вместо использования "сырого" указателя на std::string, вы используете boost::shared_ptr<std::string>и передать это вокруг. Когда вы закончите, позвоните его reset() функция; он уменьшит счетчик использования и автоматически освободит строку, если счетчик равен 0.

В качестве бонуса вы можете прикрепить boost::weak_ptr объекты этих строк (вы можете вставить их в vector может быть), и следить за тем, сколько из них все еще "живут". Таким образом, вы узнаете, что по какой-либо причине строки не уменьшаются до 0.

Чтобы было ясно:

if (_tickersQueue.size() > 0)
{
    boost::shared_ptr<std::string> ticker(new std::string(PopNextTicker()));
    if (!ticker->empty())
        _threads.create_thread(boost::bind(&TAFYahooFinanceParadigm::ExecuteNextRequest, this, ticker));
    else
        ticker.reset();  // optional; ticker will drop out of scope anyway
}

Да, вы должны настроить тип функции ExecuteNextRequest соответственно.:-)

Другие вопросы по тегам