Утечка памяти, вызванная неправильным использованием scoped_lock? - PullRequest
0 голосов
/ 08 октября 2009

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

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

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

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

1 Ответ

0 голосов
/ 08 октября 2009

Я предлагаю вместо использования «сырого» указателя на 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. : -)

...