社区
Qt
帖子详情
一个很简单的程序,内存瞬间泄露100M。求助
JCJC错别字检测-田春峰
博客专家认证
2012-03-15 12:25:00
我用QTConcurrent::run 执行了一个成员函数,里面是一个for循环。
如果for循环不被打断,他会不停的emit字符串到主线程。
主线程只是简单的在UI显示emit过来的字符串。
现在这个程序疯狂的内存泄露!我找不出来。
更奇怪的是:我这个写法在第一次编译的时候是正常的,并且发布了。在第三方机器上也是可以运行的。
谁碰到过类似问题吗?
感兴趣我可以提供源代码!
多谢
...全文
353
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有没有内存泄漏?
记一次
内存
溢出问题的排查、分析过程及解决思路
起因 这个测试工具的开发已有一段时间了,由于...虽然,作为
一个
测试喵,编码能力与纯开发相比,根本不是
一个
层次的。 当然,也可以通过
求助
开发同事解决,但这并不是退缩、逃避解决问题的理由。 这个报错,我也是第一
如何解决 OutOfMemoryError
内存
溢出 —— 原因、定位与解决方案
本文用通俗的语言解释 OOM 的常见类型、如何快速定位(命令与工具)、以及 2 个可运行的 Demo(
一个
“
瞬间
分配大对象”触发 OOM,
一个
“
内存
泄漏”模拟)来复现和验证问题,并给出实际修复建议与最佳实践。
Win XP
内存
优化
一、Windows XP优化 恢复Windows经典界面 常用软件专题 很多人安装了Windows XP后的第一感觉就是Windows变得漂亮极了。只是可惜美丽的代价要耗掉我们本就不富裕的
内存
和显存。要想恢复到和经典Windows类似的...
【
程序
猿的小幽默】
在论坛里看到的,感觉很有意思,
2024知识总结
从结构,查询(字段、key)、事务、存储(磁盘、
内存
),聚合操作(avg,sum,max,min)关系型数据库:主流有mysql、Oracl、sqlServer。以列和行的结构方式存储数据,可以
简单
理解为二维表格模型,表中的数据可以和其他...
Qt
21,437
社区成员
26,687
社区内容
发帖
与我相关
我的任务
Qt
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
复制链接
扫一扫
分享
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章