我最近一直在深入研究C++,並且我的錯誤似乎變得複雜。C++:讀取數據如何影響內存?
我有一個對象的向量,每個對象都包含一個浮點向量。我決定我需要創建一個包含所有對象的所有浮點值的進一步平面數組。它比這更復雜一些,但問題的要點是當我循環通過我的對象提取浮點值時,在某些時候,我的對象矢量被改變或以一種奇怪的方式被破壞。 (我的讀操作都是const函數)
另一個例子是MPI。我剛剛開始,所以我只是想在兩個不同的節點上用自己的內存運行完全相同的代碼,並且沒有數據傳輸發生,都非常簡單。令我驚訝的是,我得到了細分錯誤和小時追蹤,我發現一個變量的賦值是將一個完全不同的變量設置爲NULL。
所以我很好奇,讀操作如何影響我的數據結構。同樣,一個看起來不相關的操作如何影響另一個操作。我不能期望解決我的問題與這些簡要說明,但任何建議將不勝感激。
更新: 這裏有一段代碼,我沒有發佈,因爲我不確定在不理解整個系統的情況下可以從中提取多少。
我剛剛發現的一件事是,當我停止將值分配給我的平面數組,然後只是cout'ed時,seg錯誤消失了。所以也許我宣佈我的數組錯了,但即使我不確定它會如何影響對象向量。
void xlMasterSlaveGpuEA::FillFlatGenes() {
int stringLength = pop->GetGenome(0).GetLength();
for (int i=0;i<pop->GetPopSize();i++)
for (int j=0;j<stringLength;j++)
flatGenes[(i*stringLength)+j]<< pop->GetGenome(i).GetFloatGene(j);
}
float xlVectorGenome::GetFloatGene(unsigned int i) const {
return GetGene(i);
}
我的平板陣列是一個成員函數
float * flatFitness;
在構造函數中initailsed像這樣:
flatFitness = new float(popSize);
更新2:
我只是想指出的是,上面兩個例子沒有關係,第一個不是多線程的。第二個MPI示例是技術上的,但MPI是分佈式內存,我故意嘗試了我能想到的最簡單的實現,這兩個機器都是獨立運行代碼的機器。然而,有一個額外的細節,我把一個condtional說
if node 1 then do bottom half of loop
if node 1 then do top half
同樣的內存應該被孤立的,它們應該是工作,就好像他們一無所知對方..但除去該條件,使這兩個循環做所有的立方體,消除錯誤
你可以發佈你的代碼的精簡版嗎?從這一點很難說出可能發生的事情。 – tgamblin 2009-04-27 22:18:15
你可以發佈循環代碼,在迭代矢量中的對象的地方......可能你正在記憶那裏? – Balk 2009-04-27 22:19:50
讀取操作不會更改值。代碼中必須有其他東西。你的第二個例子是一個指向錯誤位置的變量的典型情況。 – fbinder 2009-04-27 22:20:48