找回密码
 立即注册
收起左侧

QT内存泄露问题

6
回复
9244
查看
[复制链接]

尚未签到

来源: 2013-11-17 17:47:55 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
大家好,最近用QT开发UI,需要创建独立的窗口,但是发现关闭新创建的窗口时存在内存泄露问题,网上找了各种方法都不好使(包括设置WA_DeleteOnClose标志,重载closeEvent并调用delete this)。
例子很简单,点击主窗口按钮出现一个新的Widget,新Widget上点击上面的close关闭。但是通过Windows内存管理器发现点击打开按钮进程内存增加,点击关闭按钮内存减少,但是增加和减少的量不一致,总是有几时KB的内存泄露问题。整个过程并没有为新的Widget设置parent,请教大家这是什么原因?(移植到ARM上也是一样的情况)

贴点儿代码好说明问题:

主窗口点击按钮通过new创建新的Widget:

  1. <div class="container"><div class="line number1 index0 alt2"><code class="c keyword bold">void</code> <code class="c plain">MainWindow::on_pushButton_clicked()</code></div><div class="line number2 index1 alt1"><code class="c plain">{</code></div><div class="line number3 index2 alt2"><code class="c spaces">    </code><code class="c plain">TestWidget *test = </code><code class="c keyword bold">new</code> <code class="c plain">TestWidget();</code></div><div class="line number4 index3 alt1"><code class="c spaces">    </code><code class="c plain">test->show();</code></div><div class="line number5 index4 alt2"><code class="c plain">}</code></div></div>
复制代码
新Widget的头文件:


  1. <div class="container"><div class="line number1 index0 alt2"><code class="c preprocessor">#include <QWidget></code></div><div class="line number2 index1 alt1"><code class="c preprocessor">#include <QPushButton></code></div><div class="line number3 index2 alt2"><code class="c preprocessor">#include <QVBoxLayout></code></div><div class="line number4 index3 alt1"> </div><div class="line number5 index4 alt2"><code class="c keyword bold">class</code> <code class="c plain">TestWidget : </code><code class="c keyword bold">public</code> <code class="c plain">QWidget</code></div><div class="line number6 index5 alt1"><code class="c plain">{</code></div><div class="line number7 index6 alt2"><code class="c spaces">    </code><code class="c plain">Q_OBJECT</code></div><div class="line number8 index7 alt1"><code class="c keyword bold">public</code><code class="c plain">:</code></div><div class="line number9 index8 alt2"><code class="c spaces">    </code><code class="c plain">TestWidget();</code></div><div class="line number10 index9 alt1"><code class="c spaces">    </code><code class="c plain">~TestWidget();</code></div><div class="line number11 index10 alt2"> </div><div class="line number12 index11 alt1"><code class="c keyword bold">protected</code> <code class="c plain">slots:</code></div><div class="line number13 index12 alt2"><code class="c spaces">    </code><code class="c keyword bold">void</code> <code class="c plain">onReturnButtonClicked();</code></div><div class="line number14 index13 alt1"><code class="c spaces">    </code><code class="c keyword bold">void</code> <code class="c plain">closeEvent(QCloseEvent *event);</code></div><div class="line number15 index14 alt2"><code class="c keyword bold">private</code><code class="c plain">:</code></div><div class="line number16 index15 alt1"><code class="c spaces">    </code><code class="c plain">QPushButton *btn_close;</code></div><div class="line number17 index16 alt2"><code class="c spaces">    </code><code class="c plain">QPushButton *btn_tmp;</code></div><div class="line number18 index17 alt1"><code class="c spaces">    </code><code class="c plain">QVBoxLayout *layout;</code></div><div class="line number19 index18 alt2"> </div><div class="line number20 index19 alt1"><code class="c plain">};</code></div></div>
复制代码
新Widget的CPP文件:


  1. <div class="container"><div class="line number1 index0 alt2"><code class="c preprocessor">#include "testwidget.h"</code></div><div class="line number2 index1 alt1"> </div><div class="line number3 index2 alt2"><code class="c plain">TestWidget::TestWidget()</code></div><div class="line number4 index3 alt1"><code class="c plain">{</code></div><div class="line number5 index4 alt2"><code class="c spaces">    </code><code class="c keyword bold">this</code><code class="c plain">->setFixedSize(480, 272);</code></div><div class="line number6 index5 alt1"><code class="c spaces">    </code><code class="c keyword bold">this</code><code class="c plain">->setAttribute(Qt::WA_DeleteOnClose, </code><code class="c keyword bold">true</code><code class="c plain">);</code></div><div class="line number7 index6 alt2"><code class="c spaces">    </code><code class="c keyword bold">this</code><code class="c plain">->setParent(NULL);</code></div><div class="line number8 index7 alt1"> </div><div class="line number9 index8 alt2"><code class="c spaces">    </code><code class="c plain">btn_close = </code><code class="c keyword bold">new</code> <code class="c plain">QPushButton(</code><code class="c string">"close"</code><code class="c plain">);</code></div><div class="line number10 index9 alt1"><code class="c spaces">    </code><code class="c plain">btn_tmp = </code><code class="c keyword bold">new</code> <code class="c plain">QPushButton(</code><code class="c string">"tmp"</code><code class="c plain">);</code></div><div class="line number11 index10 alt2"><code class="c spaces">    </code><code class="c plain">connect(btn_close, SIGNAL(clicked()), </code><code class="c keyword bold">this</code><code class="c plain">, SLOT(onReturnButtonClicked()));</code></div><div class="line number12 index11 alt1"><code class="c spaces">    </code><code class="c plain">layout = </code><code class="c keyword bold">new</code> <code class="c plain">QVBoxLayout();</code></div><div class="line number13 index12 alt2"><code class="c spaces">    </code><code class="c plain">layout->addWidget(btn_close);</code></div><div class="line number14 index13 alt1"><code class="c spaces">    </code><code class="c plain">layout->addWidget(btn_tmp);</code></div><div class="line number15 index14 alt2"><code class="c spaces">    </code><code class="c keyword bold">this</code><code class="c plain">->setLayout(layout);</code></div><div class="line number16 index15 alt1"><code class="c plain">}</code></div><div class="line number17 index16 alt2"> </div><div class="line number18 index17 alt1"><code class="c keyword bold">void</code> <code class="c plain">TestWidget::closeEvent(QCloseEvent *event)</code></div><div class="line number19 index18 alt2"><code class="c plain">{</code></div><div class="line number20 index19 alt1"><code class="c spaces">   </code><code class="c keyword bold">delete</code> <code class="c keyword bold">this</code><code class="c plain">;</code></div><div class="line number21 index20 alt2"><code class="c plain">}</code></div><div class="line number22 index21 alt1"> </div><div class="line number23 index22 alt2"><code class="c plain">TestWidget::~TestWidget()</code></div><div class="line number24 index23 alt1"><code class="c plain">{</code></div><div class="line number25 index24 alt2"><code class="c spaces">    </code><code class="c keyword bold">delete</code><code class="c plain">(layout);</code></div><div class="line number26 index25 alt1"><code class="c spaces">    </code><code class="c keyword bold">delete</code><code class="c plain">(btn_close);</code></div><div class="line number27 index26 alt2"><code class="c spaces">    </code><code class="c keyword bold">delete</code><code class="c plain">(btn_tmp);</code></div><div class="line number28 index27 alt1"><code class="c plain">}</code></div><div class="line number29 index28 alt2"> </div><div class="line number30 index29 alt1"><code class="c keyword bold">void</code> <code class="c plain">TestWidget::onReturnButtonClicked()</code></div><div class="line number31 index30 alt2"><code class="c plain">{</code></div><div class="line number32 index31 alt1"><code class="c spaces">    </code><code class="c keyword bold">this</code><code class="c plain">->close();</code></div><div class="line number33 index32 alt2"><code class="c plain">}</code></div></div>
复制代码
回复

使用道具 举报

尚未签到

2013-11-17 17:59:23 显示全部楼层
你这代码贴的。。谁看的懂啊
回复 支持 反对

使用道具 举报

累计签到:595 天
连续签到:1 天
2014-7-29 13:57:58 显示全部楼层
这代码贴的有水平,
回复 支持 反对

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-4-29 09:35:54 显示全部楼层
这是什么鬼~代码~ 到底要输入几个字、
回复 支持 反对

使用道具 举报

累计签到:344 天
连续签到:1 天
2015-4-30 10:04:41 显示全部楼层
这代码实在是看不懂,不过我建议你可以试试异常处理的方法来试试。就是try……throw……catch 这样来解决,先保证程序能顺利跑起来。
回复 支持 反对

使用道具 举报

累计签到:40 天
连续签到:1 天
2015-4-30 13:07:01 显示全部楼层
这代码贴的有水平                                          
回复 支持 反对

使用道具 举报

尚未签到

2015-5-3 05:11:24 显示全部楼层
楼主重贴啊。字数补丁补丁
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了