我的应用程序内存增加

时间:2014-10-16 09:49:33

标签: c++ qt blackberry-10

我正在学习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 个答案:

答案 0 :(得分: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()之后你的对象仍然存在于记忆中

当您想要真正摆脱列表中的所有对象时,您应该做的是:

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

这里list.clear()是多余的。