我在构造函数中使用new创建了一个七乘七的指向“Timeslot”对象的数组,如下所示:
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();
}
}
}
当我编辑一个Timeslot对象时,会对所有这些对象进行更改。我试图谷歌这个问题,但我能找到的所有实例都是没有使用new
的人。
因为我被问到,我正在向正在传播给所有这些对象的时间段对象进行的更改是使用Timeslot类的方法在位掩码中标记了一点。
void Timeslot::book(int instructor){
bitmask = bitmask | instructormasks[instructor];
}
自从发布这个问题以来,我发现每个时隙对象都获得了自己唯一的内存地址,并且不知何故,所有这些内存都会标记位掩码。我现在正在研究它。
答案 0 :(得分: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
可能是导致问题的原因。
答案 1 :(得分:2)
在我看来,当您需要2D阵列时,您正在定义3D阵列。
Timeslot ***schedule; // 3D array
schedule = new Timeslot**[DAYS]() // 2D array of 1D arrays? Or is it the other way around?
我多年没有使用C数组了,所以我不确定这会对你的初始化循环产生什么影响,但值得一看。
答案 2 :(得分:2)
您的代码没有技术问题。没有缓冲区溢出等等。显然,operator new
应该返回不同对象的不同地址,除非它们被明确释放。
然后问题很可能在你的其余代码中。
new/delete
)吗?bitmask
是Timeslot
类的非静态成员吗?无论如何,你的代码有些过于复杂。分配指针到指针指针的数组是很有用的,以防你真的要“玩”它,即在运行时重新分配指针,或有意地使用几个指针指向同一个对象。如果你处理大型对象,并且不想要长连续的内存块,它也很有用。
但是你说你总共有7x7 = 49个物体,它们(据说)很小。然后只使用一个“静态”数组:
Timeslot schedule[DAYS][TIMESLOTS];
答案 3 :(得分:0)
您有一个全局变量schedule
,它在Schedule
构造函数中初始化。
也许你对bitmask
做了同样的事情。确保bitmask
是Timeslot
的非静态成员。