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?