Я добавил специальный распределитель памяти (http://www.codeproject.com/KB/stl/blockallocator.aspx) в свой класс двусвязных списков. Пользовательский распределитель памяти хорошо работает для STL set, map, list. Однако для моего двусвязного класса я заметил, что MapViewOfFile не работает должным образом.
Вот как я вызываю MapViewOfFile: MapPtr = (char *) :: MapViewOfFile (hMapping, FILE_MAP_WRITE | FILE_MAP_READ, 0, baseoff, mappedlength); Когда я смотрю на MapPtr в отладчике Windows, я ожидал что-то вроде 0x09aa000 "", но вместо этого я вижу 0x09aa000 "23456 FRANCISCO BUSQUETS"
Вот как построить двусвязный список:
dlist> * myaccesses;
myaccesses = new dlist> ();
Вот выдержка из кода ниже. Я попытался установить точку останова Debug в коде шаблона block_allocator, но ни одна из точек останова не была достигнута, когда я вызываю MapViewOfFile. Пожалуйста, предложите, как я могу найти или исправить проблему.
template <typename Allocator = allocator< Range > >
class dlist{
public:
Allocator alloc;
class node{
public:
Range value;
node *next;
//pointer to next node
node *prev;
//pointer to previous node
node(){ next = NULL; prev = NULL; }
node(Range r){ value = r; next = NULL; prev = NULL; }
};
node *front; //pointer to front of list
node *back; //pointer to back of list
int size;
dlist(){ front=NULL; back=NULL; size = 0;}
void insertFront(Range value);
void insertBack(Range value);
void removeFront();
void removeBack();
void insertBefore(Range value,node *nodeB);
void insertAfter(Range value,node *nodeA);
void removeBefore(node *nodeB);
void removeAfter(node *nodeA);
int removeNode(node *newNode);
node * getFront(void){ return front; }
node * getBack(void){ return back; }
int getSize(){ return size; }
};
template <typename Allocator >
void dlist<Allocator >::insertBefore(Range value,node *nodeB)
{ node *newNode;
try {
typename Allocator::rebind<node>::other pointer_alloc;
newNode = pointer_alloc.allocate(1);
}
catch(std::bad_alloc &ba){
printf("Catch exception\n");
}
newNode->prev=nodeB->prev;
newNode->next =nodeB;
newNode->value =value;
if(nodeB->prev==NULL){
this->front=newNode;
}
nodeB->prev=newNode;
}
template <typename Allocator>
void dlist<Allocator>::removeNode(node *nodeToRemove){
if(nodeToRemove==this->front) {
this->front=this->front->next;
alloc.deallocate(nodeToRemove,1);
nodeToRemove = NULL;
this->front->prev=NULL;
size -= 1;
}
else if (nodeToRemove==this->back) {
this->back=this->back->prev;
alloc.deallocate(nodeToRemove,1);
nodeToRemove = NULL;
this->back->next=NULL;
}
else{
nodeToRemove->prev->next=nodeToRemove->next;
nodeToRemove->next->prev=nodeToRemove->prev;
alloc.deallocate(nodeToRemove,1);
nodeToRemove = NULL;
}
size -= 1;
}