C ++ / Qt内存泄漏?

时间:2009-08-12 09:30:16

标签: c++ qt

我注意到一个非常有趣的发现。我正在测试我的应用程序涉及一个自定义的GUI元素,该元素由来自外部源的数据更新。每当数据到达串行端口时,GUI的更新都使用插槽(Qt特定细节)功能完成。现在数据以每秒10个数据包的速率传输,即更新GUI功能每秒被调用10个数据包。除了不断增加内存占用量之外,这还会降低应用程序的速度。它起始于60 MB,并在几个小时内增加到65 MB。

我的结论是更新GUI很慢,当每秒调用10次更新插槽时,插槽调用会在长时间内排队,从而降低应用程序响应时间。

我通过缓存传入值并在传入值发生更改时更新GUI来解决此问题。

我尝试了各种免费工具,如valgrind-memcheck,泄漏检查器,但结果没有帮助,实际上泄漏检查器没有找到泄漏,但我的程序内存大小不断增加。这是否意味着它是因为信息插槽连接的排队,因为GUI更新本质上很慢?

现在问题在于此。追踪内存泄漏是很困难的,如果涉及到Qt,那么倒霉的程序员怎么能确定问题,即它实际上是内存泄漏还是信号插槽连接的排队?

2 个答案:

答案 0 :(得分:1)

内存可能会碎片化。如果页面对齐并且页面大小的倍数,AFAIK内存仅返回给操作系统。一些内存分配器永远不会给回记忆,googles malloc浮现在脑海中。

因此,如果Qt或您的应用程序不断mallocs并释放随机不同大小的小块,则可以保留内存。尽管如此,内存占用量的增加应该会减慢。

如果要更新某些类似QWidget的对象,请确保使用update()而不是重绘()。

答案 1 :(得分:0)

  

这是否意味着它是因为   将信号槽连接排队为   GUI更新本质上很慢?

是......

停止发生事件,一段时间后必须释放你的记忆。