多次调用QIODevice :: write()后抛出std :: bad_alloc

时间:2016-12-27 09:28:43

标签: c++ qt

所以我必须浏览一个我要加密/解密的大文件。

我不能直接加密/解密整个文件,所以我按块进行加密。

它适用于加密但由于某种原因它在解密部分崩溃并在尝试将第255个数据块写入输出设备后抛出“std :: bad_alloc”。

以下是代码:

bool CryptEngine::decryptByChunk(QtAES256& cryptEngine, QIODevice& source, QIODevice& dest, int chunkSize)
{
    while(source.bytesAvailable() > chunkSize)
    {
        QByteArray inputBuffer;
        QByteArray decryptedData;

        inputBuffer = source.read(chunkize);

        if (cryptEngine.decrypt(inputBuffer, decryptedData, CryptoPP::StreamTransformationFilter::NO_PADDING))
        {
            dest.write(decryptedData);
        }
        else return false;
    }
    // ...
    // Some other operations...
    // ...
}

这里chunkSize是1 MB。

抛出异常的行是第255次迭代的 dest.write(decryptedData);

有人可以解释一下这种行为吗?

修改:

用于填充decryptedData的方法

bool QtAES256::decrypt(const QByteArray& cryptedArray, QByteArray& decryptedArray, CryptoPP::StreamTransformationFilter::BlockPaddingScheme padding)
{
    decryptedArray.clear();
    //...
    decryptedArray.append(decryptedResult, arraySink->TotalPutLength());
    //...   
}

其中decryptedResult是char *

1 个答案:

答案 0 :(得分:0)

我发现了使用VMMap的问题,这是我在Waxrat建议之后下载的工具。

我可以看到在调用CryptEngine::decryptByChunk后堆内存消耗量爆炸了。

事实上,我正在写一个位于堆上的QBuffer(我认为它是QFile)。

因此,当缓冲区大小超过256 MB时,系统似乎找不到足够大的连续块来分配和返回std::bad_alloc

相关问题