一个很简单的程序,内存瞬间泄露100M。求助

JCJC错别字检测-田春峰
博客专家认证
2012-03-15 12:25:00
我用QTConcurrent::run 执行了一个成员函数,里面是一个for循环。
如果for循环不被打断,他会不停的emit字符串到主线程。

主线程只是简单的在UI显示emit过来的字符串。

现在这个程序疯狂的内存泄露!我找不出来。

更奇怪的是:我这个写法在第一次编译的时候是正常的,并且发布了。在第三方机器上也是可以运行的。



谁碰到过类似问题吗?

感兴趣我可以提供源代码!

多谢
...全文
348 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
jdwx1,dext 一并谢过。


"之所以有这样的问题,可能是楼主 对线程和 QtConcurrent 类的理解还不够。",多谢提示。

由于不是最终产品,所以退出的问题我暂时没有考虑,而且会启动多个Run线程。



“主要是for的速度比刷新UI的速度快很多,导致有很多的QString对象存在。”
这是我感到怪异的地方, 因为同样的代码,第一次编译出来就可以正常运行,没有很多QString对象的情况。


另外,同样的代码,在mac上运行的很好。这也是我感到怪异的第二个地方。 我是在mac上写好,感觉可以运行,才在windows上编译的。(第一次正常,并且我现在保留了exe,第二次以后就内存狂增了。)

感谢两位,我再调试一下。
jdwx 2012-03-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dext 的回复:]

在 emit 后 加一句 Sleep(50);
当然 还要引用 #include<windows.h>
Linux 下的话,可以 写一个 类 继承于 QThread,然后 把 Sleep public 了。

之所以有这样的问题,可能是楼主 对线程和 QtConcurrent 类的理解还不够。
当然,你的程序还有别的问题, 因为 程序的退出码 并不是 0.
[/Quote]
主要是for的速度比刷新UI的速度快很多,导致有很多的QString对象存在。
  • 打赏
  • 举报
回复


jdwx1,dext

方便私信联系吗?


这个问题很诡异,希望能当面请教一下,顺便我给你们2份源代码看看。都是很简单的代码。
但效果差异很大。

所以希望能直接聊 :-)

dext 2012-03-16
  • 打赏
  • 举报
回复
在 emit 后 加一句 Sleep(50);
当然 还要引用 #include<windows.h>
Linux 下的话,可以 写一个 类 继承于 QThread,然后 把 Sleep public 了。

之所以有这样的问题,可能是楼主 对线程和 QtConcurrent 类的理解还不够。
当然,你的程序还有别的问题, 因为 程序的退出码 并不是 0.
  • 打赏
  • 举报
回复

代码在这里:
http://www.qtcn.org/bbs/read-htm-tid-48073.html
dext 2012-03-15
  • 打赏
  • 举报
回复
单从你给的这两句来说 没什么问题。
需要你的 connect代码 和 更多信息。

[Quote=引用 8 楼 accesine960 的回复:]

源代码如下:
for:


for(int i=0; i < 100000 ;i ++){
QString abc();
abc.setNum(i);
emit signal_int( abc );
}


slot:

void abc::slot_int(const QString & abc){
label.setText(a……
[/Quote]
  • 打赏
  • 举报
回复
源代码如下:
for:


for(int i=0; i < 100000 ;i ++){
QString abc();
abc.setNum(i);
emit signal_int( abc );
}


slot:

void abc::slot_int(const QString & abc){
label.setText(abc);
}


如果注释掉emit后,内存就不泄露了。








  • 打赏
  • 举报
回复


没有内存泄露,只要停掉:emit 和 slot 。就正常了。

[Quote=引用 1 楼 cpio 的回复:]

直接调用那个函数而不用QTConcurrent::run有没有内存泄漏?
[/Quote]
修行中 2012-03-15
  • 打赏
  • 举报
回复
for循环贴出来看看,还有slot函数
  • 打赏
  • 举报
回复
我在for中emit到UI线程的是 QString。

UI线程需要delete掉这个QString吗?


[Quote=引用 3 楼 slotlovesignal 的回复:]

引用楼主 accesine960 的回复:
我用QTConcurrent::run 执行了一个成员函数,里面是一个for循环。
如果for循环不被打断,他会不停的emit字符串到主线程。

主线程只是简单的在UI显示emit过来的字符串。

现在这个程序疯狂的内存泄露!我找不出来。

更奇怪的是:我这个写……
[/Quote]
情歌而已 2012-03-15
  • 打赏
  • 举报
回复
还有一种可能,你的connect函数没有加Qt::UniqueConnection选项,然后越连越多
情歌而已 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 accesine960 的回复:]
我用QTConcurrent::run 执行了一个成员函数,里面是一个for循环。
如果for循环不被打断,他会不停的emit字符串到主线程。

主线程只是简单的在UI显示emit过来的字符串。

现在这个程序疯狂的内存泄露!我找不出来。

更奇怪的是:我这个写法在第一次编译的时候是正常的,并且发布了。在第三……
[/Quote]
你显示用的ui是new的,而且还没销毁
zhu_xz 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 accesine960 的回复:]
更奇怪的是:我这个写法在第一次编译的时候是正常的,并且发布了。在第三方机器上也是可以运行的。
[/Quote]
你的意思是第一次编译的时候没有内存泄漏,但后来就有了?
是不是你后来不小心在哪里new了点东西没释放?
cpio 2012-03-15
  • 打赏
  • 举报
回复
直接调用那个函数而不用QTConcurrent::run有没有内存泄漏?

16,819

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧