簡體   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