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