我一直在寻找在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内部“删除”这些成员变量?
不, addWidget()
函数将保持部件的所有权。 然后,它会破坏它拥有的小部件。
此外,您可以阅读在这里说:
至于QObject对象,QWidgets可以与父对象被创建,以指示所有权,以确保当他们不再使用的对象被删除。 随着小部件,这些亲子关系有一个额外的含义:每个子部件由其父控件占用的屏幕区域内显示。 这意味着,当你删除一个窗口小部件,所有的子控件包含也将被删除。
如果有新的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());
这样,你一定不要有泄漏。
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.