2009-10-30 27 views
14

我一直在寻找的Qt例子hereQt:“新的没有删除”导致内存泄漏与控制?

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

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内部“删除”这些成员变量,当它超出范围?

回答

25

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

另外,你可以阅读here

与QObject对象,QWidgets可以与父对象 创建表明所有权,以确保当他们没有 不再使用的对象被删除。使用小部件时,这些父子关系具有 附加含义:每个子小部件都显示在其父部件占用的区域的屏幕 中。这意味着当您删除一个 窗口小部件时,它所包含的所有子小部件也会被删除。

+0

+1我在猜测我的删除答案:) – AraK 2009-10-30 18:53:59

7

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

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

除了KLAIM的正确答案:

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

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

这样你肯定没有泄漏。

+0

甚至比我自己的回答更好 – 2009-10-30 23:05:08

+0

如果你这样做,它会不会被双删除? 曾经通过auto_ptr,然后再次通过QObject? – James 2010-04-22 22:50:52

+2

将std :: auto_ptr替换为std :: unique_ptr ... – Klaim 2012-03-09 21:45:19

0

由于.release()调用,它不会被删除。

注意std :: unique_ptr正在替换std :: auto_ptr。希望QT支持移动语义,然后release()将取代layout-> addLayout(std :: move(buttonLayout)),如果没有调用移动,你会得到一个编译错误。

+1

它是shared_ptr,它取代了auto_ptr,unique_ptr仅适用于不能共享的scoped ptrs,并且表示它非常适合这份工作,因为我们不想分享它。 – 2012-09-14 08:56:36