В моем приложении я сохраняю voxel-data (сжатый массив байтов) и пытается загрузить его обратно в память.Распределение памяти на C++: «новый» выбрасывает bad_alloc?
Но мое приложение аварийно завершает работу в Windows 7 (64 бит, 12 ГБ), давая bad_alloc.
Это отлично работает в Linux и работает даже на другой машине с Windows 7 с памятью 4 ГБ.
Сжатый размер байта составляет около 200 МБ, а размер несжатого байта составляет около 300 МБ (так что только 500 МБ зарезервировано перед этим «новым» утверждением, которое оставляет почти 8 ГБ, исключая системную память). Перед этим не выполняются какие-либо другие основные шаги выделения памяти, поэтому я не думаю, что память фрагментирована. Я использую MinGW GCC
версия 4.5.0
Любые советы по этому вопросу?
благодарит заранее.
QFile fileVol(strVFile);
//Read VolumeData
fileVol.open(QIODevice::ReadOnly);
QDataStream volstream(&fileVol);
QByteArray volCmprsdByteArray; //This holds the compressed byte array
//Read some additional information
int nx, ny, nz, bbp;
int voltype;
volstream >> nx;
volstream >> ny;
volstream >> nz;
volstream >> bbp;
volstream >> voltype;
volstream >> volCmprsdByteArray; //read our compressed voxel-data
//we have original uncompressed pixel data
QByteArray volUncmprsdByeArray = qUncompress(volCmprsdByteArray);
int uncompressedSize = volUncmprsdByeArray.size(); // size of the byte array
qDebug("new char for uncompressed data size %d",uncompressedSize);
unsigned char* volumeData=NULL;
//Trying to allocate new memory
try {
// ##### breaks here. ####
volumeData =new unsigned char[uncompressedSize];
}
catch (std::bad_alloc e)
{
cout << "lu_solver() bad_alloc: " << e.what() << endl;
cout << "Size " << uncompressedSize << endl;
//return;
}
Вы строите это как 32-битный двоичный или 64-битный двоичный файл? –
О, я использую CMake, и я havent указал, какой buildtype.I использовать библиотеки LGPL QT, которые являются 32bit.and в Диспетчере задач, он показывает мое приложение как * 32 бит. Поэтому я думаю, его 32-битная сборка. –
У вас уже есть несжатые данные, зачем выделять их снова? Кроме того, попробуйте спать в 'catch' и проверьте использование памяти в окнах. – ruslik