• 5557阅读
  • 1回复

Qt内存管理的疑问 [复制链接]

上一主题 下一主题
离线ddzhou1024
 
只看楼主 倒序阅读 楼主  发表于: 2010-03-23
看到资料说Qt对内存管理进行了优化,主要是说对象创建时如果指明了其父对象,那么在父对象析构时释放子对象。如果没有父对象,应该由程序员delete释放内存。例如:

//addressbook.h
class AddressBook : public QWidget
{
    Q_OBJECT
public:
    AddressBook(QWidget * parent = 0);
}

//addressbook.cpp
AddressBook::AddressBook(QWidget* parent):QWidget(parent)
{
    QLabel * nameLabel = new QLabel(tr("Name:"));

                     QGridLayout* mainLayout = new QGridLayout;
    mainLayout->addWidget(nameLabel, 0, 0);

                     setLayout(mainLayout);
    mainLayout->addWidget(nameLine, 0, 1);
}

//main.cpp
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    AddressBook *addressBook = new AddressBook;
    addressBook->show();
    return app.exec();
}

我的理解是:

1.  在main.cpp中虽然为AddressBook开辟了内存,但在构造AddressBook实例时,指明了其父对象是空,那么addressBook就是这个应用app的顶级窗口,在app.exec()销毁退出的时候,就自动delete了addressBook,释放了内存。

我的疑问是在AddressBook构造函数中的代码,nameLabel和mainLayout在new的时候并没有指明其父对象是谁,那么它们两个是在什么时候释放的呢?

离线dbzhang800

只看该作者 1楼 发表于: 2010-03-23
引用楼主ddzhou1024于2010-03-23 14:34发表的 Qt内存管理的疑问 :
看到资料说Qt对内存管理进行了优化,主要是说对象创建时如果指明了其父对象,那么在父对象析构时释放子对象。如果没有父对象,应该由程序员delete释放内存。例如:
.......


这句话是对的,后面你的理解是不太正确的。

在main.cpp中虽然为AddressBook开辟了内存,但在构造AddressBook实例时,指明了其父对象是空,那么addressBook 就是这个应用app的顶级窗口,在app.exec()销毁退出的时候,就自动delete了addressBook,释放了内存。

对照上一句,你必须delete 你的这个 addressBook。不然就是内存泄露。
对这样一个小程序,这点内存泄露有点无关紧要了,程序一退出,操作系统就负责清理了。

我的疑问是在AddressBook构造函数中的代码,nameLabel和mainLayout在new的时候并没有指明其父对象是谁,那么它们两个是在什么时候释放的呢?

在你的代码中,你用到了Layout , 布局会自动为这两个对象重定义父对象。 内存由其父对象负责释放
快速回复
限100 字节
 
上一个 下一个