2012-12-07 42 views
0

這是一個計算機科學數據結構類,我們正在製作一個「內存管理器」,也就是模仿堆的工作。基本上,如果用戶想要在堆上存儲內容,用戶需要定義多個字節。爲了在堆上存儲事物,他們傳遞他們需要的字節數,並返回一個指向堆中至少有大小的區域的指針。我得到了這個工作,但是我們有一個名爲dump()的方法,打印出用戶迄今爲止創建的所有這些「塊」,以及內存是空閒還是使用。這種方法的工作,直到我達到了一個特定的點,它給了我一個錯誤。這是我的節點的結構。解決堆上的指針,mscvp.dll錯誤? - 崩潰。 C++

struct Node 
{ 
    Node* p_right; 
    Node* p_left; 
    int sizeOfBlock; 
    bool isFree; 
}; 

這裏是產生錯誤代碼:

void MemoryManager::dump() 
{ 
     Node* p_dump = p_head; //Stores pointer with which we will loop through nodes 

     int block_num = 1; //Stores the number of the block we are at 

     while(true) 
     { 
     cout << "\tBlock " << block_num << ": " //Crashes here 
     << (p_dump->sizeOfBlock) << " bytes "; 

      if(p_dump->isFree) 
       cout << "(free)\n"; 
      else 
       cout << "(used)\n"; 
      block_num++;  //Increase the block num 

      if(p_dump->p_right->p_right == 0) //If we've found the second to last node 
       break; 
      else 
       p_dump = p_dump->p_right;  //Or else, we move the pointer 

     } 
} 

Unhandled exception at 0x5c7cfb8a (msvcp100d.dll) in MemoryManager.exe: 0xC0000005: Access violation reading location 0x0000001c. 

我p_head在像這樣的構造函數創建的,如果它可以幫助...(我的.h文件中存在p_mem)

MemoryManager::MemoryManager(int numBytes) 
{ 
//Constructor 

p_mem = new char[sizeof(Node)*2 + numBytes]; 

p_head = (Node*)p_mem;  //Create the head node 
p_tail = (Node*)(p_mem + sizeof(Node)+ numBytes); //Create the tail node 

p_head->sizeOfBlock = numBytes; //Sets the size 
p_tail->sizeOfBlock = 0;//Sets the size 

p_head->p_right = p_tail; //Sets pointer 
p_head->p_left = 0; //Sets pointer 

p_tail->p_right = 0; //Sets pointer 
p_tail->p_left = p_head; //Sets pointer 

p_head->isFree = true;  //Sets free to true 
p_tail->isFree = false; //Sets free to false 

} 
+0

http://ideone.com/P9LYLI - 我的版本的代碼不會出現段錯誤的。如果你會注意到,我的代碼不會比你的代碼複雜,但它實際上是編譯和運行的。當提出這些問題時,請提供最少的代碼,編譯和運行,以及實際發生問題的代碼。我的水晶球說你的'MemoryManager'中的其他方法有問題 - 將程序減少到最小程度,然後測試每個部分,直到找到損壞鏈表的部分。 – Yakk

回答

0

Weel,顯然,在某些時候,p_dump->p_right爲空,這使p_dump在下次循環時爲null。由於p_dump是地址0,因此p_dump-> sizeOfBlock是地址001C。

while(true)cout之間,你應該是這樣的:

assert(p_dump != null);