这个 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 看起来确实像泄漏了(带上tvbox)。 感谢您的快速回答我是 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 代码会泄漏内存吗?的主要内容,如果未能解决你的问题,请参考以下文章

这个 C++ 代码会泄漏内存吗?

闭包会造成内存泄漏吗

内存泄漏会导致我的进程被杀死吗?

Qt 4.8 endInsert/RemoveRows 导致内存泄漏?

闭包会造成内存泄漏吗?

闭包会造成内存泄漏吗?