这个Qt代码泄漏内存



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

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

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

最新更新