0

これはコンピューター サイエンスのデータ構造クラス用で、ヒープの仕事を模倣するものとして「メモリ マネージャー」を作成しています。基本的に、ユーザーは、ヒープに何かを格納したい場合に必要なバイト数を定義します。ヒープに物を格納するには、必要なバイト数を渡し、ヒープ上で少なくともそのサイズの領域へのポインタを返します。私はこれを機能させましたが、ユーザーがこれまでに作成したこれらの「チャンク」のすべてと、メモリが空いているか使用されているかを出力する 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

}
4

1 に答える 1

0

Weel は、どうやら、ある時点でp_dump->p_rightnull になり、次回のループで p_dump が null になります。また、p_dump はアドレス 0 であるため、p_dump->sizeOfBlock はアドレス 001C です。

と の間にはwhile(true)、次のcoutようなものが必要です。

 assert(p_dump != null);
于 2012-12-07T23:15:36.800 に答える