2010-08-17 80 views
2

我對Qt編程有一些說明。 在大多數情況下,我們通過動態分配內存來實例化小部件。我們使用更多的指針,有沒有什麼優勢?

從Qt的前瞻中有這樣做的好處嗎?以及如何取消分配內存的小部件?我們是否需要爲分配的內存或Qt句柄手動調用delete?

QListView *newlist = new QListView(); //This is good? if so why? 
QListView newlist; // why not this? 

回答

3

見我my reply有關的QObject。 簡而言之:在堆上創建小部件,因爲它們通常必須在當前方法中生存,並且它們不能被分配也不能被複制。 QWidgets在刪除自己的子項時(或者更一般的說,QObject會刪除子項),所以如果您將父項傳遞給小部件,通常沒有內存管理問題。

+0

@frank,謝謝你的回答。有一件事我沒有得到你的描述是「他們不能被分配也不能複製」 它究竟告訴我們什麼,我們不能分配值,我們不能使用複製構造函數複製它們? – Naruto 2010-08-18 05:14:47

+0

@Shadow:對於QObject,拷貝ctor和運算符=都是私有的。這就是爲什麼他們作爲指針傳遞的原因。 QObject不是價值觀,他們有一個「身份」。即使你實現了operator =對於一個子類,將一個QObject分配給另一個QObject會打破語義。例如,信號/插槽連接不被複制。 – 2010-08-18 06:19:37

+0

@Frabk,我仔細分析了http://doc.trolltech.com/4.5/shared.html#overview,我發現了一個疑問。 QPixmap p1,p2; p1.load(「image.bmp」); p2 = p1; // p1和p2共享數據 這裏p2和p1是從Qt預期中共享的,但不是來自程序員預期的權利。在一般情況下將一個對象分配給另一個會導致深拷貝權利?但Qt說這將是淺拷貝..如果我在這裏更改p2的值,該怎麼辦? – Naruto 2010-08-18 06:22:49

3

看起來像它的安全做堆棧分配。見this answer。但對於Symbian來說,它可能有所不同。 This question帶來了一些好點。

我認爲,使用Symbian時,您的堆棧空間有限,而且許多對象本身都使用數據共享,而這些數據共享無論如何均分配在堆上。在這方面,動態地繼續這樣做可能是一個好主意。

+0

它是安全的,但它通常不是你想要的。該部件將在離開該區塊時立即銷燬。例外是QDialogs與exec()(哪些塊)。 – 2010-08-17 17:00:08

3
QListView* newlist = new QListView(); //This is good? if so why? 

僅當您將newlist指針存儲在某處並稍後手動將其刪除時。

如果可能,我會建議在堆棧上分配你的小部件。但是,使用我即將解釋的技術時,這是不可能的。

在設計複雜的小部件時,通常會創建一個小部件的object tree。這意味着除了根部件外,每個部件都有一個父部件。當父母被刪除時,它會自動刪除其所有孩子。此方法非常方便,因爲您只需跟蹤根部件。

在你的情況,你會做這樣的事情:

QListView* newlist = new QListView(parentWidget);