社区
Qt
帖子详情
一个很简单的程序,内存瞬间泄露100M。求助
JCJC错别字检测-田春峰
博客专家认证
2012-03-15 12:25:00
我用QTConcurrent::run 执行了一个成员函数,里面是一个for循环。
如果for循环不被打断,他会不停的emit字符串到主线程。
主线程只是简单的在UI显示emit过来的字符串。
现在这个程序疯狂的内存泄露!我找不出来。
更奇怪的是:我这个写法在第一次编译的时候是正常的,并且发布了。在第三方机器上也是可以运行的。
谁碰到过类似问题吗?
感兴趣我可以提供源代码!
多谢
...全文
348
14
打赏
收藏
一个很简单的程序,内存瞬间泄露100M。求助
我用QTConcurrent::run 执行了一个成员函数,里面是一个for循环。 如果for循环不被打断,他会不停的emit字符串到主线程。 主线程只是简单的在UI显示emit过来的字符串。 现在这个程序疯狂的内存泄露!我找不出来。 更奇怪的是:我这个写法在第一次编译的时候是正常的,并且发布了。在第三方机器上也是可以运行的。 谁碰到过类似问题吗? 感兴趣我可以提供源代码! 多谢
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
JCJC错别字检测-田春峰
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对象存在。
JCJC错别字检测-田春峰
2012-03-16
打赏
举报
回复
jdwx1,dext
方便私信联系吗?
这个问题很诡异,希望能当面请教一下,顺便我给你们2份源代码看看。都是很简单的代码。
但效果差异很大。
所以希望能直接聊 :-)
dext
2012-03-16
打赏
举报
回复
在 emit 后 加一句 Sleep(50);
当然 还要引用 #include<windows.h>
Linux 下的话,可以 写一个 类 继承于 QThread,然后 把 Sleep public 了。
之所以有这样的问题,可能是楼主 对线程和 QtConcurrent 类的理解还不够。
当然,你的程序还有别的问题, 因为 程序的退出码 并不是 0.
JCJC错别字检测-田春峰
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]
JCJC错别字检测-田春峰
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后,内存就不泄露了。
JCJC错别字检测-田春峰
2012-03-15
打赏
举报
回复
没有内存泄露,只要停掉:emit 和 slot 。就正常了。
[Quote=引用 1 楼 cpio 的回复:]
直接调用那个函数而不用QTConcurrent::run有没有内存泄漏?
[/Quote]
修行中
2012-03-15
打赏
举报
回复
for循环贴出来看看,还有slot函数
JCJC错别字检测-田春峰
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有没有内存泄漏?
记一次
内存
溢出问题的排查、分析过程及解决思路
起因 这个测试工具的开发已有一段时间了,由于...虽然,作为
一个
测试喵,编码能力与纯开发相比,根本不是
一个
层次的。 当然,也可以通过
求助
开发同事解决,但这并不是退缩、逃避解决问题的理由。 这个报错,我也是第一
Win XP
内存
优化
一、Windows XP优化 恢复Windows经典界面 常用软件专题 很多人安装了Windows XP后的第一感觉就是Windows变得漂亮极了。只是可惜美丽的代价要耗掉我们本就不富裕的
内存
和显存。要想恢复到和经典Windows类似的...
【
程序
猿的小幽默】
在论坛里看到的,感觉很有意思,
题解 | #The Intriguing Obsession#
题意给你一串数字,这个数字包含的数位为,然后每个数位出现的次数为,然后问你有多少个数字满足,每个都出现过,并且出现的次数都小于等于思路枚举每个出现的次数,然后排。举报了哥,你什么都没做错,全怪我那...
N70/N72常见问题汇总
引自:http://bbs.imobile.com.cn/viewthread.php?tid=1092547这里是一些常见的问题,
求助
前请看里面有没有你需要的答案,或者善用论坛的搜索功能已更新至第四楼 为什么我看不到手机或
内存
卡上的system文件夹?...
Qt
16,819
社区成员
26,685
社区内容
发帖
与我相关
我的任务
Qt
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
复制链接
扫一扫
分享
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章