Добрый день! Мы пытаемся создать прототип программы кэширования памяти с отображением файлов для использования в 32-битных приложениях Windows и Linux.Каждый раз, когда мы запускаем прототип, мы получаем ошибку 487 (ошибочный адрес ошибки), когда мы пытаемся вызвать UnMapViewOfFile, чтобы отобразить область файла с кэшированной памятью.Мы думаем, что это происходит, потому что мы пытаемся разархивировать ранее не отображенный регион.Нам было интересно, возможно ли игнорировать это сообщение об ошибке.
Мы стараемся, чтобы каждый вызов MapViewOfFile соответствовал UnMapViewOfFile следующим образом. Каждый раз, когда мы вызываем MapViewOfFile, мы используемследующий код:
std::deque<Range> ranges_type;
std::multimap<char *,Range> mmultimap;
MapPtr = (char*)::MapViewOfFile(hMapping,
FILE_MAP_WRITE | FILE_MAP_READ,
0, baseoff,
mappedlength);
if (MapPtr == 0){
DWORD lasterr = GetLastError();
ErrorMessage(lasterr);
}
ranges_type.insert(RangeDeque::value_type(
PreviousNCopy,
PreviousN,
adjustedptr + n,
MapPtr,
TimeStamp,
mappedlength));
mmultimap.insert(RangeMultiMap::value_type(
MapPtr,
Range(PreviousNCopy,
PreviousN,
adjustedptr + n,
MapPtr,
TimeStamp,
mappedlength)));
Каждый раз, когда мы отображаем область файла с отображенной памятью, мы используем следующую выдержку:
typedef std::multimap<char *,Range>::const_iterator I;
numerased = 0;
std::pair<I,I> b = mmultimap.equal_range(TmpPrevMapPtr);
for (I i=b.first; i != b.second; ++i){
std::dequeue<Range>::iterator iter;
iter = std::lower_bound(ranges_type.begin(),
ranges_type.end(),
i->second);
if (iter != ranges_type.end() && !(i->second < *iter)){
ranges_type.erase(iter);
numerased++;
}
}
erasecount = mmultimap.erase(TmpPrevMapPtr);
retval = UnmapViewOfFile(TmpPrevMapPtr);
if (retval == 0){
DWORD lasterr = GetLastError();
ErrorMessage(lasterr);
}
Класс Range выглядит следующим образом:
class Range {
public:
explicit Range(int item){
mLow = item;
mHigh = item;
mPtr = 0;
mMapPtr = 0;
mStamp = 0;
mMappedLength = 0;
}
Range(int low, int high, char* ptr = 0,char* mapptr = 0, int stamp = 0, int currMappedLength = 0){
mLow = low;
mHigh = high;
mPtr = ptr;
mMapPtr = mapptr;
mStamp = stamp;
mMappedLength = currMappedLength;
}
Range(const Range& r):
bool operator==(const Range& rhs) const{
return (mLow <= rhs.mLow && mHigh >= rhs.mHigh);
}
bool operator<(const Range& rhs) const{
return mHigh < rhs.mHigh;
}
public:
int mLow;
int mHigh;
char* mPtr;
char* mMapPtr;
int mStamp;
int mMappedLength;
}; // class Range
Спасибо за чтение этого поста.