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

StackOverflow https://stackoverflow.com/questions/1535207

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top