我的应用程序中的内存增加

Posted

技术标签:

【中文标题】我的应用程序中的内存增加【英文标题】:Memory increasing in my app 【发布时间】:2014-10-16 09:49:32 【问题描述】:

我正在学习 c++,我需要一些关于如何在不使用指针时清理内存的建议。

我有一个后台 Blackberry 10 应用程序,它在停止之前的内存限制为 3MB,我的应用程序由于达到此限制而被停止,我无法找出原因。

我已将增加内存的范围缩小到一个函数 - 如果我不调用此函数,则内存不会增加。

该函数使用 QVariant、QVariantList、QVariantMap、QString,它们是在创建类时在函数外部声明的(即 QVariantMap 映射),在我在函数中访问这些对象之前,我在每个对象上调用 .clear()我的理解应该清理所持有的内存,我也在函数中使用 int ,它们也在它之外声明。

该函数非常大,并且正在调用其他函数,因此我在下面提供了我正在执行的操作的 sn-p,以防其他人明显错误。

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>();

任何帮助表示赞赏。

【问题讨论】:

你读了多少条记录(recordsRead变量)? btw qt 项目推荐list of Tools for Profiling and Memory Checking。试试这个列表中的 Massi。 recordsRead 显示为 1,这是正确的,因为数据库中只有一行。 你不是唯一一个遇到这个问题的人:supportforums.blackberry.com/t5/Native-Development/… 清除列表只会破坏列表中存储的对象。所以如果resultlist 存储指向对象的指针,这些指针会被遗忘,但关联的对象仍然存在。这可能会导致内存泄漏 【参考方案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() 是多余的。

【讨论】:

以上是关于我的应用程序中的内存增加的主要内容,如果未能解决你的问题,请参考以下文章

当 CPU 利用率和内存增加时,计时器间隔增加

Solaris 中的 prstat SIZE 值增加是不是表明内存泄漏?

绘制图像时Javafx的内存使用量增加

iOS - UILabel(CALayer) - VMalloc 内存不断增加

由于堆大小增加,android中的内存不足错误

导航期间内存增加,但堆看起来不错?