C++ 使用new()创建数组时,数组的所有成员都位于同一内存位置

C++ 使用new()创建数组时,数组的所有成员都位于同一内存位置,c++,pointers,new-operator,C++,Pointers,New Operator,我已经在构造函数中创建了指向“Timeslot”对象的七乘七指针数组,使用new,如下所示: Timeslot ***schedule; Schedule::Schedule(void) { schedule = new Timeslot**[DAYS](); for(int day = 0; day < DAYS; day++){ schedule[day] = new Timeslot*[TIMESLOTS](); for(int ti

我已经在构造函数中创建了指向“Timeslot”对象的七乘七指针数组,使用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();
        }
    }
}

自从发布这个问题以来,我发现是的,每个时隙对象都有自己唯一的内存地址,并且不知何故,它们中的位掩码都被标记。我现在正在调查

此处存在缓冲区溢出:

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

for(int day=0;day在我看来,当您需要一个二维阵列时,您似乎正在定义一个三维阵列

Timeslot ***schedule; // 3D array


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

我已经多年没有使用C数组了,所以我不确定这会对初始化循环产生什么影响,但值得一看。

您有一个全局变量
schedule
,它在
schedule
构造函数中初始化。 也许您对
位掩码
也在做同样的事情。请确保
位掩码
时隙
的非静态成员。您的代码没有技术问题。没有缓冲区溢出等。显然,
运算符new
应该为不同的对象返回不同的地址,除非明确指定释放

那么问题很可能在代码的其余部分

  • 您是否使用标准堆(
    new/delete
  • 位掩码
    时隙
    类的非静态成员
无论如何,你的代码有点太复杂了。如果你真的要“玩”的话,把指针数组分配给指针数组是很有用的有了它,即在运行时重新分配指针,或有意使多个指针指向同一个对象。在处理大型对象,不需要长的连续内存块的情况下,它也很有用

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


您正在进行哪些更改,以及如何定义和实现该类?我想应该为每天/时间组合分配一个新的时间段()。更改时间段时,您可能做错了什么?在更改时间段时,为什么不使用std::vector和/或std::map?这是一个小问题(但很重要)注意:您的
for
循环是一对多循环的!您是如何确定“对所有循环都进行了更改”的?该代码可能有一个错误给您留下这样的印象。时隙***计划;-这可能是原因;)这里没有缓冲区溢出@瓦尔多-在编辑问题之前出现了溢出。@瓦尔多,是的,收回-1!:D@Shahbaz当前位置:我正试图拿回它,但它被锁定:(因为他在三个级别上都是新的,也许他确实需要一个3d数组。@Shahbaz可能需要,但当他在他的“7*7数组”中查看他的
时隙时,他可能看错了位置。是的,原来我一直在声明bitmask是全局的。我不觉得很傻吗。
for(int time = 0; time <= TIMESLOTS; time++)
    schedule[day][time] = //rest of code
Timeslot ***schedule; // 3D array


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