删除另一个堆对象时如何删除堆上的对象

时间:2012-04-18 10:44:43

标签: c++ qt delete-operator

我有以下源代码:

void Processmethod()
{
    QDialog *ProcessMessage = new QDialog;      
    Ui::DialogProcessMessage *Dialog = new Ui::DialogProcessMessage();              
    Dialog->setupUi(ProcessMessage);              //polymorphy
    ProcessMessage->setModal(true);
    ProcessMessage->setAttribute(Qt::WA_DeleteOnClose);
    connect(Dialog->pushButtonAbort, SIGNAL(clicked()), &Prozess, SLOT(kill()));  
    connect(&Prozess6, SIGNAL(finished(int, QProcess::ExitStatus)),  this, SLOT(helper()));
    connect(&Prozess6, SIGNAL(error(QProcess::ProcessError)),  this, SLOT(helper()));
 connect(this,SIGNAL(enablePushButton(bool)),Dialog->pushButtonClose, SLOT(setEnabled(bool)));
    Prozessmeldung->setModal(true);
    ProcessMessage->show();

    processmethodONE();
}

如果删除堆对象ProcessMessage(在关闭时删除),如何最好地删除堆对象Dialog?必须在堆上创建这两个对象。此外,类“Ui :: DialogProcessMessage”由ui文件直接创建,因此每次更改ui文件时都会删除其中的任何更改。

4 个答案:

答案 0 :(得分:2)

你需要子类化QDialog,在你的子对象的新类中添加字段,在创建时添加它,并添加析构函数,当你的CustomNewSubclassedQDialog被破坏时,它将释放subojbects的内存。

答案 1 :(得分:1)

您可以在delete的析构函数中Dialog ProcessMessage个对象。

您必须对此进行记录,以明确ProcessMessageDialog负责。请注意,这似乎不是一个好主意。这里最好的方法是在完成这两个对象后手动删除它们。没有任何限制任何人在自动存储中创建Dialog,在尝试删除时可能会导致未定义的行为。

答案 2 :(得分:1)

Ui::DialogProcessMessage是你自己的一类吗?它来自QObject吗?如果是,请将ProcessMessage指针作为Dialog传递给parent构造函数。这样ProcessMessage负责删除Dialog。即你对Ui::DialogProcessMessage类的声明看起来应该是这样的:

namespace Ui
{
class DialogProcessMessage: public QDialog
{
  Q_OBJECT
public:
  DialogProcessMessage(QObject* parent=0) :
    QDialog(parent)
  { /* ... */ }

  /*
   * more stuff ...
   */
};
}

然后,按如下方式构建Dialog

Ui::DialogProcessMessage *Dialog = new Ui::DialogProcessMessage(ProcessMessage);

您可能需要参考Qt documentation以获取更多信息。

答案 3 :(得分:1)

QObject的所有实例在删除时都会发出destroyed(QObject*)信号。将ProcessMessage的信号连接到其他持久对象的插槽,然后从那里删除Dialog堆对象。

参考:Qt documentation for QObject