我尝试通过学习开源来学习更多关于编程的知识 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
答案 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);
由于前面提到的原因,这也没问题。