2009-10-08 77 views
0

我有內存泄漏,我想這是由scoped_lock(Boost)的錯誤用法引起的。然而,我無法找到確切的問題,我相信代碼編寫的方式也不完全正確。由於scoped_lock的使用錯誤導致內存泄漏?

該代碼是在這個類有: http://taf.codeplex.com/SourceControl/changeset/view/31767#511225

主要重要的方法是ThreadedLoop()。基本上,這個方法是在一個線程內開始的,並定期檢查雅虎下載的市場數據。對於每個股票(或其他),將創建一個新的線程(用於ExecuteNextRequest()方法),將包含股票名稱的字符串作爲參數傳遞給指針。這是我唯一的內存分配,但它在線程執行結束時釋放。我也會對如何增強這段代碼感興趣(當然,我可以使用一個線程池,但這還不是重點)。非常感謝!

+2

誤用鎖定原語將更有可能導致死鎖,而不是內存泄漏 – 2009-10-08 02:05:11

+1

您可以使用簡單的'std :: string'而不是指向它的指針。我不認爲指針有任何目的,但我也不認爲這是你的內存泄漏的原因... – sth 2009-10-08 02:14:28

+0

@sth:我同意你的評論。但是,在可能想要使用該字符串變爲可變的情況下,如果所有引用都可見,則'shared_ptr'仍然有用。 :-) – 2009-10-08 03:12:28

回答

0

我建議您不要使用指向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。 :-)

+0

你說得對,在這裏使用原始指針是沒用的。但是,內存泄漏與線程的密集創作有關......我實現了一個極簡主義線程池,並且它的工作效果更好。 – TigrouMeow 2009-10-08 07:34:27