2010-02-09 35 views
3

我對QT沒有多少經驗,今天出現這個問題。QList中的動態內存

QList<int> memList; 
const int large = 100000; 

getchar(); 
for (int i=0; i<large; i++) 
{ 
    memList.append(i); 
} 

cout << memList.size() << endl; 
getchar(); 

for (int i=0; i<large; i++) 
{ 
    memList.removeLast(); 
} 

cout << memList.size() << endl; 
getchar(); 

第一循環後,當我查看內存使用它上升爲新的元素被添加到memList,但第二循環中取出之後,內存使用率保持在同一水平。我認爲QList是動態的,當元素被移除時它會釋放內存。所以要麼我錯過了一些東西(非常可能),或者它不是動態結構。你有什麼想法如何使它工作?

問候

回答

4

docs看來這是預期的行爲:

注意內部數組永遠只能得到在列表上的生命大。它永遠不會縮小。當一個列表被分配給另一個列表時,內部數組將被析構函數和賦值運算符解除分配。

如果你想取消分配你有幾個選項

  1. 確保調用析構函數(使用刪除存儲{假設你new'd擺在首位名單},或允許的QList對象走出去的範圍)
  2. 分配一個空單的大​​名單(認爲這將工作)
+0

但使用刪除,不會我需要將其聲明爲指針的QList *的memlist ;? – 2010-02-09 16:38:10

+0

@有趣的人,是的,你需要使用新的 – Glen 2010-02-09 16:52:34

0

的QList是中途之間QVector(類似於標準::向量)和QLinkedList(類似於std :: list)。 QList擁有一個指向對象本身的指針數組。

該方案意味着對列表進行排序/重新排序的速度很快,但隨着項目的添加(類似於矢量),指針存儲會不斷增大。因此,從列表中刪除項目可釋放項目使用的內存,但不會釋放陣列中的指針。

要回收內存,您需要構造一個新列表。 QVector擠壓(),但似乎不在QList中。

-1

QList推薦用於< 1000個對象的列表。如果您需要處理非常大的列表,並且需要在刪除對象時回收內存,則應考慮使用QLinkedList。

-2

從QList作試試這個代碼來釋放內存

while(! memList.isEmpty()) 
    delete memList.takeFirst(); 
+0

分配它沒有指針參與問題。所以你不能刪除任何東西。 – alexisdm 2011-09-16 14:00:36