2017-10-23 13 views
0

나는 QNetworkReply을 가지고 있는데, 다운로드 한 바이트를 QByteArray에 저장하고 싶습니다. Qt : QByteArray에서 잘못된 alloc 예외를 디버깅하는 방법?

connect(_replyRef, SIGNAL(readyRead()), this, SLOT(PushDownloadedBytesToFile())); 
void PushDownloadedBytesToFile() 
{ 
    _internalBufferBytes.append(_replyRef->readAll()); 
} 

문제

는 크기가 약 33552950.

나는 문제가 아니면이 어떻게 디버깅 할 수 있습니다 무엇을 이해하지 못하는 때 나는 bad alloc를 얻을 수 있다는 것입니다.

+1

버퍼 전체를 읽지 않고 청크 단위로 읽는 것은 어떨까요? 이 파일은 32Mb이고, 다음 파일은 512Mb가 될 수 있습니다. 이러한 대용량 파일의 처리는 한 장씩 수행해야합니다. –

+0

음 ... 나는 청크로 청크를 읽었지만, ..... 이유로 인해 40Mb의 버퍼를 가져야합니다. – user3132974

+1

잘못된 alloc에 ​​대해 두 개의 reasos가있을 수 있습니다. 메모리가 충분하지 않고 힙이 손상되었습니다. 40MB는 요즘 꽤 평범한 크기로 보입니다. 그래서 valgrind는 당신의 친구입니다. –

답변

0

버퍼에서 40MB를 유지하는 것과 관련하여 미리 QByteArray::reserve() API를 사용하여이 많은 메모리를 예약하는 것이 좋습니다 (더 좋을 것입니다). 그러나 QByteArray을 사용하면 총 크기, 소비 된 크기, 현재 색인 등을 유지해야합니다.

QStringreserve()과 함께 사용하는 다른 해결책이있을 수 있습니다. 세부 사항을 유지할 필요는 없습니다. QString::append()을 사용하고 QString::toUtf8()을 사용하여 QByteArray으로 변환하면됩니다.