![](/img/trans.png)
[英]Do class/struct members always get created in memory in the order they were declared?
[英]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
)嗎?bitmask
是Timeslot
class 的非靜態成員嗎?無論如何,您的代碼有點過於復雜。 分配 arrays 的指針到指針到指針是很有用的,以防你真的要“玩”它,即在運行時重新分配指針,或者有意地讓幾個指針指向同一個 object。它是如果您處理巨大的對象並且不想要求很長的連續 memory 塊,也很有用。
但是你說你總共有 7x7 = 49 個對象,這些對象(應該)很小。 然后只使用一個“靜態”數組:
Timeslot schedule[DAYS][TIMESLOTS];
您有一個在Schedule
構造函數中初始化的全局變量schedule
。 也許你正在用bitmask
做同樣的事情。 確保bitmask
是Timeslot
的非靜態成員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.