Qt:“新的没有删除”导致内存泄漏与控制?

我在这里查看Qt示例:

并在构造函数中,它们有:

 Window::Window()
 {
     editor = new QTextEdit();   // Memory leak?
     QPushButton *sendButton = new QPushButton(tr("&Send message")); // Memory leak?

     connect(sendButton, SIGNAL(clicked()), this, SLOT(sendMessage()));

     QHBoxLayout *buttonLayout = new QHBoxLayout();  // Memory leak?
     buttonLayout->addStretch();
     buttonLayout->addWidget(sendButton);
     buttonLayout->addStretch();

     QVBoxLayout *layout = new QVBoxLayout(this);    // Memory leak?
     layout->addWidget(editor);
     layout->addLayout(buttonLayout);

     setWindowTitle(tr("Custom Type Sending"));
 }

那些评论

// Memory leak?

不是那些内存泄漏?

如果是这样,由于Window类没有构造函数,那么我应该使所有这些变量(编辑器已经是)窗口成员变量?

或者..让Qt内部“删除”这些成员变量,当它超出范围?


不, addWidget()函数将保持小部件的所有权。 然后它会销毁它拥有的小部件。

另外你可以在这里阅读:

和QObjects一样,可以使用父对象创建QWidgets以指示所有权,确保在不再使用对象时删除对象。 通过窗口小部件,这些父子关系具有其他含义:每个子窗口小部件都显示在其父窗口小部件占用的屏幕区域内。 这意味着当你删除一个窗口小部件时,它所包含的所有子部件也被删除。


如果在new和addWidget之间引发异常,那么是的就是内存泄漏。 否则,父控件将获取内存的所有权。

QHBoxLayout *buttonLayout = new QHBoxLayout();  // Memory leak?
//make sure you don't throw here
buttonLayout->addWidget(sendButton);

除了Klaim的正确答案:

我会将这些指针存储在std::auto_ptr ,同时将它们传递给它们的父代。

std::auto_ptr<QHBoxLayout> buttonLayout( new QHBoxLayout() );
// make things which could throw...
layout->addLayout(buttonLayout.release());

这样你肯定不会有泄漏。

链接地址: http://www.djcxy.com/p/78753.html

上一篇: Qt: does "new without delete" cause memory leaks with controls?

下一篇: Django, ajax populate form with model data