繁体   English   中英

我的数组的所有成员在使用 new() 创建时都位于相同的 memory 位置

[英]All the members of my array are at the same memory location when they were created using new()

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

当我编辑一个时隙 object 时,所有时隙都会发生变化。 我试图用谷歌搜索这个问题,但我能找到的所有实例都是没有使用new的人。

自从我被问到后,我对传播给所有这些人的时隙 object 所做的更改是我使用时隙 class 的方法在位掩码中标记了一点。

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

自发布此问题以来,我发现是的,每个时隙 object 都获得了自己唯一的 memory 地址,并且以某种方式在所有时隙中都标记了位掩码。 我现在正在调查。

你这里有一个缓冲区溢出:

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

这可能是你的问题的原因。

在我看来,当你需要一个二维数组时,你正在定义一个 3D 数组。

Timeslot ***schedule; // 3D array


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

多年来我没有使用 C arrays 所以我不确定这对你的初始化循环有什么影响,但它值得一看。

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

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

  • 您使用的是标准堆( new/delete )吗?
  • bitmaskTimeslot class 的非静态成员吗?

无论如何,您的代码有点过于复杂。 分配 arrays 的指针到指针到指针是很有用的,以防你真的要“玩”它,即在运行时重新分配指针,或者有意地让几个指针指向同一个 object。它是如果您处理巨大的对象并且不想要求很长的连续 memory 块,也很有用。

但是你说你总共有 7x7 = 49 个对象,这些对象(应该)很小。 然后只使用一个“静态”数组:

Timeslot schedule[DAYS][TIMESLOTS];

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM