2009-10-08 73 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