Возможно ли, чтобы пользовательский распределитель памяти влиял на Windows API MapViewOfFile? - PullRequest
0 голосов
/ 01 августа 2011

Я добавил специальный распределитель памяти (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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...