这个 Qt 代码会泄漏内存吗?
Posted
技术标签:
【中文标题】这个 Qt 代码会泄漏内存吗?【英文标题】:Does this Qt code leak memory? 【发布时间】:2014-05-04 13:45:51 【问题描述】:我尝试通过学习开源来学习更多关于编程的知识 UML。我发现的代码处于 Qt 3 和 Qt 4 之间的阶段。 该项目不是那么活跃,所以我在这里问这个问题。也许 我应该补充一点,使用此代码的程序确实可以运行。
注意,我是小学生。我问是因为我想学习。
我的问题很简单:这段代码会泄漏内存吗?
如果不是,为什么?
void warn(const QString & s)
// not showed dialog to compute needed size
QDialog d_aux;
Q3VBoxLayout * vbox_aux = new Q3VBoxLayout(&d_aux);
vbox_aux->setMargin(5);
Q3TextEdit * e = new Q3TextEdit(&d_aux);
e->setText(s);
// showed dialog
QDialog * d = new QDialog;
d->setCaption("My caption");
Q3VBoxLayout * vbox = new Q3VBoxLayout(d);
vbox->setMargin(5);
Q3TextView * t = new Q3TextView(d);
QFontMetrics fm(QApplication::font());
int maxw = (MyWindow::get_workspace()->width() * 4) / 5;
int maxh = (MyWindow::get_workspace()->height() * 4) / 5;
int he = (e->lines() + 5) * fm.height();
t->setText(s);
t->setMinimumSize(maxw, (he > maxh) ? maxh : he);
vbox->addWidget(t);
d->show();
谢谢 // JG
【问题讨论】:
看起来确实如此。有 5 个new
表达式,而不是一个 delete
。分配的内存可能会在其他地方被释放,但从显示的代码来看,在哪里(如果有的话)并不明显。
@jrok:然后又是 Qt,一切都隐含地占据了整个地方的所有权。我愿意为 Qt++11 付费...
@Kerrek。确实。在 Qt 文档中几秒钟后,QDialog d_aux
似乎是 vbox_aux
的父级,它稍后会处理它。但是d
看起来确实像泄漏了(带上t
和vbox
)。
感谢您的快速回答我是 Qt 新手,我怀疑 Qt 在幕后做了一些神奇/可疑的事情。但是,我几乎可以肯定这段代码正在泄漏。现在我知道。我将在我的 UML 图中将此代码标记为泄漏并继续。换句话说,为未来的研究提供了一个金块。谢谢!!
@KerrekSB:Qt++11 已经存在很久了。 ;)
【参考方案1】:
你有一个:The QDialog * d = new QDialog;
其他指针有一个父实例,它拥有指针的所有权。 (请在Q3VBoxLayout、Q3TextEdit和Q3TextView的文档中确认)
【讨论】:
最好在答案中提出解决方案。【参考方案2】:我认为您正在泄漏内存,但在 Linux 等上使用valgrind
之类的程序进行验证会很简单。让我们看看您在函数中做了哪些动态内存分配:
Q3VBoxLayout * vbox_aux = new Q3VBoxLayout(&d_aux);
没关系,因为它有一个父级。让我们看看下一个:
Q3TextEdit * e = new Q3TextEdit(&d_aux);
出于与上述相同的原因,这也可以。让我们看看下一个:
QDialog * d = new QDialog;
在这里,您开始出现问题,因为对话框没有父级。您有多种修复方法。
1) 指定一个父级,尽管在这种情况下这可能并不理想,因为您的代码中似乎没有任何类似于父级的外观。也就是说,如果您正在使用它,那么与您的 Qt 应用程序不同,没有什么可以真正成为它的父级。根据您显示的整个上下文,此修复可能需要进行一些重大修改。
2) 使用智能指针,例如QPointer 围绕它,所以它会自动为你管理。这应该在您使用的代码时代就已经可用。根据您未提供的更多上下文,这可能还需要一些代码返工。
让我们看看接下来的动态内存分配:
Q3VBoxLayout * vbox = new Q3VBoxLayout(d);
由于前面提到的原因,这没关系。让我们看看下一个和最后一个:
Q3TextView * t = new Q3TextView(d);
由于前面提到的原因,这也可以。
【讨论】:
由于详细程度和建议的答案,我给这个答案绿色标记。上下文被提到了几次。我在一个名为 myio.cpp 的文件中找到了这个函数,该文件主要处理解析文件和字符串化枚举。我觉得有点奇怪,必须深入挖掘才能找出原因。使用 UML 分析代码开始变得非常有趣... @JimG:好的,np。不知道为什么你的答案如此被否决。恕我直言,这是一个有效的问题。以上是关于这个 Qt 代码会泄漏内存吗?的主要内容,如果未能解决你的问题,请参考以下文章