我的应用程序中的内存增加
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/…
清除列表只会破坏列表中存储的对象。所以如果result
和list
存储指向对象的指针,这些指针会被遗忘,但关联的对象仍然存在。这可能会导致内存泄漏
【参考方案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() 是多余的。
【讨论】:
以上是关于我的应用程序中的内存增加的主要内容,如果未能解决你的问题,请参考以下文章
Solaris 中的 prstat SIZE 值增加是不是表明内存泄漏?