Qt QString获得了大量内存

时间:2011-08-09 09:42:15

标签: c++ qt memory

执行下面的代码后,我看到了

encoded = QString(DicResourceByteArray.toBase64().data());

获得太多内存。大约60MB。

如何从内存中释放它?

Dic_block DicBlock;
qint64 Count;
int pos, len;
QByteArray DicResourceByteArray;
QDataStream out(&DicResourceByteArray, QIODevice::WriteOnly);

QString encoded;
while(DicInstance.readBlock(DicBlock))
{

    if(DicBlock.type == 2)
    {
        pos = 0;
        len = (unsigned char)DicBlock.data[pos++];
        std::string filename( DicBlock.data+pos, len );
        pos += len;

        out.writeRawData(DicBlock.data + pos, DicBlock.length - pos);

        encoded = QString(DicResourceByteArray.toBase64().data());

        QString strQuery = QString("INSERT INTO Dictionary_Resources([FileName], [ImageBasedOn64]) values('%1', '%2')").arg(QString::fromStdString(filename), encoded);

        query->exec(strQuery);

        delete encoded;


    }
}
delete query;
db.close();

//...

DicInstance.close();

3 个答案:

答案 0 :(得分:4)

首先:使用.toBase64().constData()获取数据数组,这可以避免数据的可能副本。

第二件事:将QString encoded;的声明移到if - 块中,这可以确保在释放if块的内存之后。

第三件事:删除delete encoded;! (令人惊讶的是它编译为编码不是指针)。

答案 1 :(得分:2)

您不需要delete encoded,QString将在块结束时自动删除(并从内存中释放)。

答案 2 :(得分:1)

通过将encoded的内容复制到strQuery,您的工作效率非常低。将其绑定为查询中的值。