Я читаю три большие двоичные файлы (каждый один c.180Mb) в станде :: вектор следующим образом:Bad Ошибка выделения при наполнении зОго :: вектора
m_ifStream.open("myfile.dat", std::ios::binary | std::ios::in);
if (m_ifStream)
{
//Obtain input stream length
m_ifStream.seekg (0, ios::end);
streamLength = (size_t)(m_ifStream.tellg());
m_ifStream.seekg (0, ios::beg);
//Reserve doesn't work around the problem, may be more efficient though...
//m_buffer = new vector<unsigned char>();
//m_buffer->reserve(streamLength);
//Next line sometimes results in bad_alloc when reading a large file
m_buffer = new vector<unsigned char>((std::istreambuf_iterator<char>(m_ifStream)), (std::istreambuf_iterator<char>()));
}
Вызова для заполнения вектора не удается, выбрасывая исключение «плохого распределения».
Население иногда терпит неудачу при чтении первого файла; в других случаях он терпит неудачу на втором или третьем. Я использую Visual Studio 2010 и компилирую мой код как 32-разрядный, который должен иметь возможность адресовать до 2 ГБ. Я работаю на машине с 16 Гб оперативной памяти, с не менее 10 ГБ бесплатно, поэтому нехватка доступной памяти не является проблемой. Ошибка возникает как в конфигурации отладки, так и в выпуске.
Предварительная выделение памяти с помощью reserve
не помогает.
Свойство max_size
объекта возвращает 2^32, поэтому оно не является ограничением в контейнере.
Код в порядке с большим количеством небольших файлов с общим размером> 180 Мб, что заставляет меня думать, что мой код попадает в границу.
Есть ли способ для заполнения вектора из большого входного файла? Я хотел избежать повторения каждого байта в файле и думал, что с помощью istreambuf_iterator
будет оптимизирован для такого рода операций.
Да, это вектор. – pdm2011