2014-10-16 78 views
4

我正在學習C++,我需要一些關於如何在不使用指針時清理內存的建議。在我的應用程序中增加的內存

我有一個背景黑莓10應用它停止前具有3MB的內存限制,我的應用程序被停止,因爲達不到這個限制,我無法找到弄清楚爲什麼。

我縮小了的記憶給函數的增加 - 如果我不調用此函數的內存也不會增加。

該函數使用QVariant,QVariantList,QVariantMap,QString在創建類時(即QVariantMap映射)在函數外部聲明,在函數中訪問這些對象之前,我在每個函數上調用.clear()我的理解應該清理存儲的內存,我也在函數中使用int,這些函數也在其外部聲明。

的作用是相當大的,並呼籲其他功能,所以我下面提供的片斷我在做什麼的情況下,這顯然是錯誤給他人。

bindings.clear(); 
bindings["name"] = name; 
result.clear(); 
result = sqlda->execute(sqlQueryz, bindings); 
if (!sqlda->hasError()) { 

    if(!result.isNull()) { 
     list.clear(); 
     list = result.value<QVariantList>(); 
     recordsRead = list.size(); 

     for(int iii = 0; iii < recordsRead; iii++) { 
      map.clear(); 
      map = list.at(iii).value<QVariantMap>(); 

任何幫助表示讚賞。

+1

你讀了多少條記錄('recordsRead'變量)? btw qt項目推薦一個[用於分析和內存檢查的工具列表](http://qt-project.org/wiki/Profiling-and-Memory-Checking-Tools)。試試Massi,它在這個列表中。 – UmNyobe 2014-10-16 10:13:15

+0

recordsRead顯示爲1,這是正確的,因爲數據庫中只有一行。 – Anthony1234 2014-10-16 10:39:10

+2

你不是唯一一個這樣的問題:http://supportforums.blackberry.com/t5/Native-Development/Headless-Apps-Databases-and-Memory/mp/2985760 – 2014-10-16 10:52:56

回答

1

上的QList或在QMAP調用.clear()清除列表,但不釋放在列表中的對象,因此,例如,如果您有:

QList<QObject *> list; 
QObject *c = new QObject(); 
c->setObjectName("object_a"); 
list.append(c); 

QObject *b = new QObject(); 
b->setObjectName("object_b"); 
list.append(b); 

qDebug() << list.count(); //here you get 2 
list.clear(); 
qDebug() << list.count(); //here you get 0; 

qDebug() << a->objectName(); // Here you get "object_a" 

這意味着.clear後()你ojects仍然生活在記憶

當你想真正擺脫列表中的所有對象,你應該做的是:

while (list.count() > 0) 
    delete list.takeFirst(); 

這裏list.clear()是多餘的。

相關問題