Доступ к нарушению при работе с большими файлами, которые не могут быть сопоставлены с одним представлением в Win32 - PullRequest
0 голосов
/ 01 марта 2011

Доброе утро, я пытаюсь написать класс cMemoryMappedFile, который работает с большими файлами, которые нельзя сопоставить с одним представлением в Win32.Код находится по адресу pastebin url .

. В GetPointer () мы стараемся аккуратно отображать и отображать области файлов по мере необходимости.Мы сталкиваемся с нарушением доступа в GetPointer () в строке, помеченной комментарием // здесь происходит сбой, если настроенный ptr - плохой ptr.

Тестовая программа:равно 28521 и i * 54 = 1540134, мы получаем адрес чтения нарушения доступа 0x0024000.MEM_BLOCK_SIZE имеет выравнивание 64 КБ, требуемое MapViewOfFile, MEM_BLOCK_SIZE = 65536 * 2. Мы работаем под управлением Windows XP Professional Версия 2002 с пакетом обновления 3, 32-разрядная версия.То, что озадачивает, - то, что мы пытаемся переместить представление карты в пределах отображения файла.Пожалуйста, укажите причину нарушения доступа, если хотите.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 01 марта 2011

Этот расчет кажется слишком сложным.

char * cMemoryMappedFile::GetPointer(int n){
    unsigned int baseoff;
    if( n < MEM_BLOCK_SIZE / 2)
    {
       baseoff = 0;
    }
    else
    {
        baseoff = ((n + MEM_BLOCK_SIZE / 4) &
           (~(MEM_BLOCK_SIZE / 2 - 1))) - MEM_BLOCK_SIZE / 2;
    }
    ...

Как я понимаю, n - это желаемое смещение в файле, а baseoff - это первый адрес, который мы на самом деле отобразим. Нам нужно наибольшее значение baseoff <= <code>n, где baseoff - это кратное MEM_BLOCK_SIZE. Так как насчет:

    unsigned int baseoff = (n / MEM_BLOCK_SIZE) * MEM_BLOCK_SIZE;

Позже:

    MapPtr = (char*)::MapViewOfFile(hMapping, FILE_MAP_WRITE | FILE_MAP_READ, 0,
                    baseoff, mappedlength);

Вы должны проверить результат MapViewOfFile.

Не ясно, что вы хотите, чтобы возвращаемое значение было. Я предполагаю, что adjustedptr + n должен указывать на первоначально запрошенный байт. Но затем вы пытаетесь получить доступ к *adjustedptr, который не гарантируется как часть представления, когда базовое смещение больше MEM_BLOCK_SIZE. Я думаю, вы хотите, чтобы printf использовал *(adjustedptr + n) или adjustedptr[n]. Или, может быть, вы пытаетесь получить доступ к первому отображенному байту, который будет adjustedptr[baseoff].

0 голосов
/ 02 марта 2011
 I fixed the access violation and the Microsoft operator delete error. The modified code is in the www.pastebin.com url.<iframe src="http://pastebin.com/embed_iframe.php?i=4dsVfkzg" style="border:none;width:100%"></iframe> > I wish to thank Adrian 

Маккарти и Андре Карон за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...