Qt文档指出,如果一个QObject有父对象,那么当父对象被删除时,它也将删除所有的子对象。然而,如果我有多个默认父对象(0)的QObjects,它们何时会被删除?并且删除的顺序是什么?
Qt
创建了一个巧妙的机制,使得程序员不必考虑这些问题,因为许多错误是由于它们而发生的。因此,Qt
引入了父对象,即如果您为QObject
设置了一个父对象,则在删除父对象时,QObject
也将被删除。QObject
指针作为成员,但没有为它们设置父对象,则当该类的实例被删除时,除非您在析构函数中手动删除它们,否则会出现内存泄漏。class MyObject : public QObject
{
public:
MyObject(QObject *parent = 0);
~MyObject();
private:
QTimer *m_pTimer;
}
MyObject::MyObject(QObject *parent) : QObject(parent)
{
m_pTimer = new QTimer; // memory leak when this will be destroyed
}
MyObject::~MyObject()
{
}
this
作为父级提供:MyObject::MyObject(QObject *parent) : QObject(parent)
{
m_pTimer = new QTimer(this);
}
或者
MyObject::~MyObject()
{
delete m_pTimer;
}
class MyObject : public QObject
{
public:
MyObject(QObject *parent = 0);
~MyObject();
private:
QTimer m_timer;
}
MyObject::MyObject(QObject *parent) : QObject(parent)
{
// Do stuff
}
MyObject::~MyObject()
{
}
MyObject
)超出作用域时,所有成员都会被销毁。Qt
中的布局系统。QPushButton
的QWidget
。如果你创建一个QLayout
,将QPushButton
添加到QLayout
并使用QWidget::setLayout
设置QLayout
,那么QPushButton
和QWidget
之间以及QLayout
和QWidget
之间将自动创建子父关系。class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
QGridLayout *m_pLayout;
QPushButton *m_pButton;
};
Widget::Widget(QWidget *parent) :
QWidget(parent)
{
m_pLayout = new QGridLayout;
m_pButton = new QPushButton;
m_pButton->setText("Push me!");
m_pLayout->addWidget(m_pButton, 0, 0);
setLayout(m_pLayout); // In this moment *this* will be automatically
// set as parent for both m_pLayout and m_pButton
// even though no parent was passed to their constructors.
}
Widget::~Widget()
{
}
new QTimer
。你说为了修复这个问题,你应该提供它作为父对象:代码片段
或者空的析构函数
。我认为你想在那里放置delete timer;
。 - undefined