这个Qt代码会泄漏内存吗?

时间:2014-05-04 13:45:51

标签: c++ qt memory-leaks qtgui qdialog

我尝试通过学习开源来学习更多关于编程的知识 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

2 个答案:

答案 0 :(得分:3)

你有一个:The QDialog * d = new QDialog;其他指针有一个父实例,它取得了指针的所有权。 (请在Q3VBoxLayout,Q3TextEdit和Q3TextView的文档中确认)

答案 1 :(得分:1)

我认为你正在泄漏内存,但在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);

由于前面提到的原因,这也没问题。