Утечка памяти, вызванная неправильным использованием scoped_lock?
-
20-09-2019 - |
Вопрос
У меня утечка памяти, и я предполагаю, что это вызвано неправильным использованием scoped_lock (Boost).Однако мне не удается найти точную проблему, и я действительно считаю, что способ написания кода также не совсем правильный.
Код находится в этом классе там:http://taf.codeplex.com/SourceControl/changeset/view/31767#511225
Основным важным методом является ThreadedLoop().По сути, этот метод запускается в потоке и регулярно проверяет, загружаются ли рыночные данные для Yahoo.Для каждого запаса (или еще чего-либо) будет создан новый поток (для метода ExecuteNextRequest()), передающий в качестве параметра указатель на строку, содержащую название запаса.Это единственное выделение памяти, которое я делаю, но оно освобождается в конце выполнения потока.
Мне было бы также интересно, как этот код можно было бы улучшить (конечно, я мог бы использовать threadpool, но дело пока не в этом).Большое спасибо!
Решение
Я предлагаю, чтобы вместо использования "необработанного" указателя на 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
соответствующим образом.:-)