Vazamento de memória causado por um uso errado de Scoped_lock?
-
20-09-2019 - |
Pergunta
Eu tenho um vazamento de memória e acho que é causado por um uso errado de Scoped_lock (Boost). No entanto, não consigo encontrar o problema exato e acredito que a maneira como o código foi escrito não está completamente certo.
O código está nesta classe lá:http://taf.codeplex.com/sourcecontrol/changeset/view/31767#511225
O principal método importante é o ThreadLoop (). Basicamente, esse método é iniciado dentro de um tópico e verifica regularmente os dados do mercado para o Yahoo. Para cada estoque (ou então), um novo thread será criado (para o método ExecutEnextReCest (), passando como um parâmetro um ponteiro para string que contém o nome da estoque. Esta é a única alocação de memória que faço, mas é lançada no final da execução do thread.
Eu também estaria interessado em como esse código poderia ser aprimorado (é claro que eu poderia usar um threadpool, mas esse ainda não é o ponto). Muito Obrigado!
Solução
Eu sugiro que, em vez de usar um ponteiro "cru" para std::string
, você usa um boost::shared_ptr<std::string>
, e passe por aí. Quando você terminar, ligue para o seu reset()
função; Ele diminuirá a contagem de uso e liberará a string automaticamente quando a contagem for 0.
Como bônus, você pode anexar boost::weak_ptr
objetos para essas cordas (você pode colocá -las em um vector
talvez) e monitore quantos deles ainda estão "vivem". Dessa forma, você saberá se algo está fazendo com que as cordas não diminuam para 0 por qualquer motivo.
Para ser claro:
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
}
Sim, você tem que ajustar o tipo de função de ExecuteNextRequest
adequadamente. :-)