1

私はキューを扱うラボに取り組んでいますが、これは完全に関連しているとは思いません。私の仕事は「優先キュー」を作成することであり、それを行うために私が考えることができる最良の方法は次のとおりです

void IntQueue::enqueue(int num,int priorityOfEntry)
{   
    if (isFull())
        cout << "The queue is full.\n";
    else
    {   
        // Calculate the new rear position
        //insert correct lab code here haha
        if (priorityOfEntry == 1)
        {   
            rear = (rear + 1) % queueSize;
            queueArray[rear] = num;
            queueSize++;
        }   
        else if (priorityOfEntry == 2)
        {   

            queueSize++;

            int* newArray = new int[queueSize];
            newArray[0] = num;

            for(int counter = 0;counter< queueSize; counter++)
            {   
                newArray[counter+1] = queueArray[counter];
            }   

            queueArray = newArray;

            delete [] newArray;

        }   
        else cout << "invalid priority" << endl;

        // Insert new item


        // Update item count
        numItems++;


    }   
}   

メインプログラムで説明する優先度は 1 と 2 の 2 つだけです。すべての優先度が同じ場合はもちろん問題なく動作しますが、優先度を上げるとデストラクタでエラーがスローされます。

これがこのラボに取り組む正しい方法だとは本当に思いませんが、うまくいくようです..少なくとも、実際にこのメモリエラーを修正できれば. 唯一の問題は、デストラクタが削除すると考えているアドレスを変更することだと思います..しかし、ポインタはすでにそれを説明していると思いました。自分のプログラムをデバッグすることを学ぶ必要があることを理解しています。本当です。しかし、コードをじっと見つめているだけで、そこにはレンガの壁しかないことがあります。それが正しい方向への微調整の目的だと思います。

4

3 に答える 3

4

queueArrayこの後のダングリングポインターです:

  queueArray = newArray; // Both 'queueArray' and 'newArray' point to
                         // the same memory after this assignment. 
  delete [] newArray;

queueArrayを指しているメモリとしてdeleted されています。アクセスまたは破棄しようとする試みqueueArrayは、既に破棄されているメモリにアクセスしていることになります。正しい順序は次のとおりです。

delete[] queueArray;
queueArray = newArray;

forさらに、コピーを実行するループ内で範囲外アクセスが発生する可能性があります。

for(int counter = 0;counter< queueSize; counter++)
{
    // When 'counter == queueSize - 1'
    // 'newArray[counter + 1]' is one past the end.
    newArray[counter+1] = queueArray[counter];
}
于 2013-04-19T06:49:05.700 に答える
2

ここ:

queueArray = newArray; // queueArray and newArray point to the same place
delete [] newArray;    // that place gets delete[]ed

と同じ場所をqueueArray指していnewArrayますが、その場所にある配列を削除しています。したがってqueueArray、OS に返されたメモリを指しているままになります。つまり、現在はダングリング ポインタです。

delete queueArray[]最初に、次に割り当てる必要がありますnewArray

于 2013-04-19T06:49:26.720 に答える
0

わかりました。優先度が切り替わったときに、配列の別のメンバーを追加する必要があると思った理由がわかりません。ただ疲れているだけだと思います。

それが余分な配列メンバーであり、それが唯一の他の問題だったと思います

于 2013-04-19T07:04:04.893 に答える