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