• 全部
  • 问答

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

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

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

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

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



谁碰到过类似问题吗?

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

多谢
...全文
226 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
田春峰 2012-03-16
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对象存在。
回复
田春峰 2012-03-16


jdwx1,dext

方便私信联系吗?


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

所以希望能直接聊 :-)

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

之所以有这样的问题,可能是楼主 对线程和 QtConcurrent 类的理解还不够。
当然,你的程序还有别的问题, 因为 程序的退出码 并不是 0.
回复
田春峰 2012-03-15

代码在这里:
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]
回复
田春峰 2012-03-15
源代码如下:
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后,内存就不泄露了。








回复
田春峰 2012-03-15


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

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

直接调用那个函数而不用QTConcurrent::run有没有内存泄漏?
[/Quote]
回复
修行中 2012-03-15
for循环贴出来看看,还有slot函数
回复
田春峰 2012-03-15
我在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有没有内存泄漏?
回复
相关推荐
发帖
Qt
创建于2009-11-04

1.3w+

社区成员

Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
申请成为版主
帖子事件
创建了帖子
2012-03-15 12:25
社区公告
暂无公告