我的数组的所有成员在使用new()创建它们时位于相同的内存位置

时间:2012-04-04 08:39:29

标签: c++ pointers new-operator

我在构造函数中使用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];
}

自从发布这个问题以来,我发现每个时隙对象都获得了自己唯一的内存地址,并且不知何故,所有这些内存都会标记位掩码。我现在正在研究它。

4 个答案:

答案 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)吗?
  • bitmaskTimeslot类的非静态成员吗?

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

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

Timeslot schedule[DAYS][TIMESLOTS];

答案 3 :(得分:0)

您有一个全局变量schedule,它在Schedule构造函数中初始化。 也许你对bitmask做了同样的事情。确保bitmaskTimeslot的非静态成员。