Почему MapViewOfFile возвращает неиспользуемый указатель для rapidxml? - PullRequest
1 голос
/ 29 июня 2010

Как и предполагалось: у меня есть файл, размер которого превышает 2 гига. Я сопоставляю с памятью следующую функцию:

char* ptr = (char*) MapViewOfFile( map_handle, 
      FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, 0 );

Я анализирую ptr на rapidxml, который принимает Ch*. Согласно документации из rapidxml ptr должна быть изменяемой, но так как она объявлена ​​типа char*, это не может быть сделано. Программа компилируется, но когда во время выполнения она вылетает со следующей ошибкой: нарушение прав доступа. Я обнаружил, что это происходит, когда я анализирую char*. Как мне обойти это, пожалуйста?

Ответы [ 3 ]

3 голосов
/ 29 июня 2010

Вы передаете 0 для последнего аргумента MapViewOfFile (). Этот аргумент называется dwNumberOfBytesToMap. Поскольку вы выбрали ноль, все 2 гигабайта будут отображены. Это не может работать в 32-битном режиме, виртуальной памяти недостаточно. Значение ptr будет NULL, любая попытка записи через указатель приведет к генерации AV.

Вам необходимо отобразить разделы файла.

2 голосов
/ 29 июня 2010

Слепое предположение: ptr, вероятно, NULL. Из документации

Если функция не работает, возвращается значение равно NULL. Чтобы получить расширенную ошибку информация, вызовите GetLastError.

Если вы дадите больше информации, мы, вероятно, сможем помочь больше. Проверьте возвращаемое значение в отладчике. Относительно первого параметра дескриптора функции map_handle: CreateFileMapping и OpenFileMapping возвращают этот дескриптор. Может быть, вы использовали какую-то другую функцию, чтобы получить ручку?

1 голос
/ 29 июня 2010

Ваше "Нарушение прав доступа" является ошибкой доступа к памяти.Другими словами, ваша программа обращалась к памяти, которой она не принадлежала.Это, вероятно, вызвано тем, что ваш синтаксический анализатор пытается выполнить чтение за пределами памяти, выделенной для файла, или, как предполагает jdehaan , функция MapViewOfFile возвращает NULL.

UPDATE:

Если MapViewOfFile не возвращает NULL, возможно, проблема в том, что вы обращаетесь за пределы выделенного диапазона для сопоставленного файла.Похоже, вы указали в своих комментариях по этому вопросу, что операция синтаксического анализа также изменяет XML-документ путем добавления некоторых завершающих тегов.Это, несомненно, увеличит длину файла и, таким образом, запишет за конец блока файла в памяти.Это может вызвать ошибку, которую вы видите.

Если это не так, то, возможно, вы не вызвали CreateFileMapping с правильными спецификаторами доступа.В документации для MapViewOfFile говорится, что вам нужно указать параметр PAGE_EXECUTE_READWRITE при создании объекта сопоставления файлов, если вы хотите представление карты, которое разрешает доступ для чтения / записи.

Если это не тактогда я подозреваю, что ключом может быть ответ Ганса .На какой системе вы работаете?Это 32-битная Windows или 64-битная?Если размер файла превышает 2 ГБ, вы не сможете отобразить его.

...