これはコンピューター サイエンスのデータ構造クラス用で、ヒープの仕事を模倣するものとして「メモリ マネージャー」を作成しています。基本的に、ユーザーは、ヒープに何かを格納したい場合に必要なバイト数を定義します。ヒープに物を格納するには、必要なバイト数を渡し、ヒープ上で少なくともそのサイズの領域へのポインタを返します。私はこれを機能させましたが、ユーザーがこれまでに作成したこれらの「チャンク」のすべてと、メモリが空いているか使用されているかを出力する dump() というメソッドがあります。この方法は、エラーが発生する特定のポイントに到達するまで機能します。これが私のノードの構造体です。
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 はコンストラクターで作成されます。それが役立つ場合は... (p_mem は私の .h ファイル内に存在します)
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
}