0

コンストラクターで「Timeslot」オブジェクトへのポインターの7行7列の配列を、次のようにnewを使用して作成しました。

Timeslot ***schedule;

Schedule::Schedule(void)
{
    schedule = new Timeslot**[DAYS]();
    for(int day = 0; day < DAYS; day++){
        schedule[day] = new Timeslot*[TIMESLOTS]();
        for(int time = 0; time < TIMESLOTS; time++){
            schedule[day][time] = new Timeslot();
        }
    }
}

1つのTimeslotオブジェクトを編集すると、それらすべてに変更が加えられます。私はこの問題をグーグルで検索しようとしましたが、私が見つけたすべてのインスタンスは、を使用していない人々でしnewた。

尋ねられたので、それらすべてに伝播されているタイムスロットオブジェクトに加えている変更は、Timeslotクラスのメソッドを使用してビットマスクのビットにフラグを立てていることです。

void Timeslot::book(int instructor){
    bitmask = bitmask | instructormasks[instructor];
}

この質問を投稿してから、はい、各タイムスロットオブジェクトが独自のメモリアドレスを取得しており、どういうわけか、それらすべてでビットマスクにフラグが付けられていることを発見しました。今調べています。

4

4 に答える 4

3

ここにバッファオーバーフローがあります:

for (int day = 0; day <= DAYS; day++)
    schedule[day] = // rest of code

そしてここ

for(int time = 0; time <= TIMESLOTS; time++)
    schedule[day][time] = //rest of code

それが問題の原因である可能性があります。

于 2012-04-04T08:44:51.297 に答える
2

コードに技術的な問題はありません。バッファオーバーフローなどはありません。また、operator new明示的に解放されない限り、明らかに、異なるオブジェクトに対して個別のアドレスを返す必要があります。

その場合、問題はおそらくコードの残りの部分にあります。

  • 標準ヒープ(new/delete)を使用していますか?
  • クラスbitmask非静的メンバーですか?Timeslot

とにかく、あなたのコードはやや複雑すぎます。実際に「遊ぶ」場合、つまり実行時にポインタを再割り当てする場合、または意図的に複数のポインタを作成して同じオブジェクトを指す場合に備えて、ポインタからポインタへのポインタの配列を割り当てると便利です。また、巨大なオブジェクトを処理し、長い連続したメモリブロックを要求したくない場合にも役立ちます。

しかし、合計で7x7 = 49個のオブジェクトがあり、それらは(おそらく)小さいと言います。次に、1つの「静的」配列を使用します。

Timeslot schedule[DAYS][TIMESLOTS];
于 2012-04-04T09:14:50.117 に答える
2

2D配列が必要なときに、3D配列を定義しているように思えます。

Timeslot ***schedule; // 3D array


schedule = new Timeslot**[DAYS]() // 2D array of 1D arrays? Or is it the other way around?

私は何年もC配列を使用していないので、これが初期化ループにどのような影響を与えるかはわかりませんが、一見の価値があります。

于 2012-04-04T09:04:32.967 に答える
0

コンストラクターscheduleで初期化されるグローバル変数があります。Scheduleたぶんあなたはで同じことをしているでしょうbitmaskbitmaskがの非静的メンバーであることを確認してくださいTimeslot

于 2012-04-04T09:07:44.013 に答える