В моем коде моделирования я использую boost файлы с отображением памяти для размещения больших массивов на диске.
Это работает хорошо, но я не смог найти способ обнаружить ситуацию, в которой я выделяю массив, размер которого больше, чем свободное место на диске. Например, следующий код будет успешно выполняться (при условии, что у меня меньше 8E9 байт свободного места на жестком диске):
boost::iostreams::mapped_file_params file_params;
file_params.path = path;
file_params.mode = std::ios::in | std::ios::out;
file_params.new_file_size = static_cast<size_t>(8E9); # About 10GB
file_params.length = static_cast<size_t>(8E9);
boost::iostreams::mapped_file result;
result.open(file_params);
Я даже могу работать на resuld.data()
, пока не запишу часть памяти, которая не выделена (из-за нехватки места на жестком диске), и тогда я получаю следующую ошибку:
memory access violation at address: 0x7e9e2cd1e000: non-existent physical address
Есть ли способ обнаружить эту ошибку до того, как я получу загадочное memory access violation
?
Я на самом деле проверил это: если файл больше доступного свободного места в разделе, код имеет нарушение доступа к памяти, если он меньше, код работает (я проверил это, изменив свободное пространство в разделе, а не редактируя код).
Возможные решения
Если я std:fill
содержимым файла с нулями, я все равно получаю memory access violation
, но эта ошибка находится рядом с распределением и ее легче отлаживать. Я бы предпочел, чтобы какой-то способ вызвать исключение.
/tmp
(размером 10 ГБ), код работает, если я записываю файл размером 2,5 ГБ в этот раздел, он взрывается с этой ошибкой. Это может быть какая-то непонятная ошибка в boost --- это может быть молчаливое усечение пространства (в этом случае я действительно получил бы доступ к памяти за пределами диапазона). - person jb.   schedule 31.10.2014