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();
        }
    }
}

当我编辑一个时隙对象时,对所有对象都进行了更改。我试图用谷歌搜索这个问题,但我能找到的所有实例都是人们不使用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

在我看来,当您需要 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 回答
2

您的代码没有技术问题。没有缓冲区溢出等。显然,operator new除非它们被显式释放,否则应该为不同的对象返回不同的地址。

那么问题很可能出在您的其余代码中。

  • 您是否使用标准堆 ( new/delete)?
  • 是类bitmask非静态成员Timeslot​​?

无论如何,您的代码有些过于复杂。如果您真的要“玩”它,即在运行时重新分配指针,或者故意使多个指针指向同一个对象,分配指针到指针到指针的数组很有用。如果您处理大型对象并且不想要求长的连续内存块,它也很有用。

但是你说你总共有 7x7 = 49 个物体,它们(据说)很小。然后只需使用一个“静态”数组:

Timeslot schedule[DAYS][TIMESLOTS];
于 2012-04-04T09:14:50.117 回答
0

您有一个在构造函数schedule中初始化的全局变量。Schedule也许你正在做同样的事情bitmask。确保它bitmaskTimeslot.

于 2012-04-04T09:07:44.013 回答