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!

Foi útil?

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. :-)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top