Qt QString получает много памяти - PullRequest
0 голосов
/ 09 августа 2011

После выполнения кода ниже, я вижу, что строка

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

получает слишком много оперативной памяти. Примерно 60 МБ.

Как я могу освободить его из памяти?

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 ]

4 голосов
/ 09 августа 2011

Первое: захватите массив данных с помощью .toBase64().constData(), это позволит избежать возможной копии ваших данных.

Второе: переместите объявление QString encoded; в if -блок, это гарантирует, что после освобождения памяти блока if.

Третье: удалите delete encoded;! (Удивительно, что он компилируется как закодированный, а не указатель).

2 голосов
/ 09 августа 2011

Вам не нужно delete encoded, QString будет автоматически удален (и освобожден из памяти) в конце вашего блока.

1 голос
/ 11 августа 2011

Вы делаете вещи очень неэффективно, копируя содержимое encoded в strQuery. Вместо этого свяжите его как значение в вашем запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...