Qt的:做“新不删除”与对照导致内存泄漏?(Qt: does “new without delete

2019-09-02 19:11发布

我一直在寻找在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类没有构造函数的话,我应该让所有这些变量(编辑已经为)窗口的成员变量?

Or..does当它超出范围的Qt内部“删除”这些成员变量?

Answer 1:

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

此外,您可以阅读在这里说:

至于QObject对象,QWidgets可以与父对象被创建,以指示所有权,以确保当他们不再使用的对象被删除。 随着小部件,这些亲子关系有一个额外的含义:每个子部件由其父控件占用的屏幕区域内显示。 这意味着,当你删除一个窗口小部件,所有的子控件包含也将被删除。



Answer 2:

如果有新的addWidget之间抛出的异常然后是有内存泄漏。 否则,家长控制占用内存的所有权。

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


Answer 3:

除了KLAIM的正确答案:

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

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

这样,你一定不要有泄漏。



Answer 4:

It won't get double deleted because of the .release() call.

Note std::unique_ptr is replacing std::auto_ptr. Hopefully QT will support move semantics then that release() would be instead layout->addLayout(std::move(buttonLayout)) and without the call to move, you'd get a compile error.



文章来源: Qt: does “new without delete” cause memory leaks with controls?