2009-02-25 43 views
6
class MyWidget : public QWidget { public: 
    MyWidget(QWidget *parent=0, const char *name=0); }; 


MyWidget::MyWidget(QWidget *parent, const char *name) 
     : QWidget(parent, name) { 
    QPushButton *quit = new QPushButton("Quit", this, "quit"); 
    quit->setGeometry(62, 40, 75, 30); 
    quit->setFont(QFont("Times", 18, QFont::Bold)); 
} 

在上面的代碼中quit堆分配,這是必要的,因爲它是進myWidget爲什麼Qt需要在堆中分配子對象?

孩子爲什麼Qt的需要分配在堆子對象的?

+1

如果我猜你的意思,你的問題似乎是愚蠢的,所以我想我是錯了,因爲你的意思,所以你應該合頭韻。 – mxcl 2009-02-26 00:14:28

回答

0

我覺得這裏的想法是,Qt的有它的大多數對象自身的內部引用計數,如果你通過他們周圍,使用寫入時複製等

你可以在你的問題更具體?

+1

隱式共享對象爲PIMPL數據執行**內部**堆分配,但這是一個實現細節。一個常見的情況是,只有堆棧引用計數的對象可以通過發送的事件或直接連接的信號隱式共享。比如說,當你通過一個直接連接將一個`QString`傳遞給一個插槽時。沒有任何字符串實例存在於堆中。 PIMPL依然存在 - 但同樣,這不是問題所在。 – 2014-01-23 18:02:21

+0

感謝您的洞察力。 – ypnos 2014-01-24 00:56:55

+0

如果他們在堆上,並且子對象通知父母他們的刪除,那麼您可以選擇相當隨意地刪除它們。 – spraff 2015-11-27 22:00:50

-1

還有什麼其他的選擇?從堆棧? Qt如何知道何時從堆棧中分配以及何時從堆中分配?從當前函數返回時,從堆棧分配的東西將會消失,因此對象的生命週期可能比使用時間短得多。想象一下,將一個節點添加到樹中。該節點將在當前函數返回後很長時間使用。這將導致訪問隨機存儲器,分段故障,核心轉儲等。

2

如果我明白你問的是正確的,我認爲它主要歸結爲傳統和示例,帶有一點頭標依賴性拋出。

當然,替代方法是將quit聲明爲MyWidget的成員變量。如果你這樣做,那麼你需要包含QPushButton的頭文件,其中MyWidget被聲明,而不是在實現文件中。你給的例子也依賴於QObject的父關係來跟蹤按鈕的內存,並在銷燬時刪除它,所以它不需要被指定爲類中的成員。

我很肯定你可以改變爲堆棧分配,如果你真的想。

5

在你的例子中,quit不必分配堆。

此代碼編譯並執行罰款:

struct MyWidget : QWidget 
{ 
    QPushButton quit; 

    MyWidget() 
    { 
     quit.setGeometry(62, 40, 75, 30); 
     quit.setFont(QFont("Times", 18, QFont::Bold)); 
    } 
}; 
相關問題