我正在学习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>();
任何帮助表示感谢。
答案 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()是多余的。