Утечка памяти, вызванная неправильным использованием 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
соответственно.:-)