2011-02-11 55 views
0

好的我很難理解我在做什麼錯誤。在我的頭文件中,我有一個指向圖像指針數組的指針:在C++中爲數組分配新內存時遇到的問題

Image **images; 
int maximum; //size 

這是一個名爲scene的類的一部分。現在,場景有一個叫做changemax的成員函數,它改變了圖像數組的大小。你可以減少或增加。

所以我做了什麼是成立了一個名爲newArray臨時數組,複製所有的值從this->images,刪除this->images,然後分配新的內存爲images,從複製到newArrayimages,然後刪除newArray

雖然代碼沒有編譯,但Valgrind得到了超過100,000個錯誤。具體而言,我不認爲Valgrind的喜歡,說images=new Image*[newmax];

+1

你沒有使用容器類的具體原因是什麼? – 2011-02-11 00:50:20

+0

這是一個功課問題嗎? – templatetypedef 2011-02-11 00:51:02

+0

@Jim你指什麼容器類?例如, – Snowman 2011-02-11 00:52:45

回答

2

你肯定有內存泄漏此行:

newArray[i]=new Image; 
if(images[i] !=NULL) { 
    // ... 
} 
else { 
    newArray[i]=NULL; 
} 

你爲什麼要創建新的陣列?您只需要創建一個新陣列,將舊陣列的內容複製到新陣列中,銷燬舊陣列,然後分配images指向新陣列。

爲什麼你要創建新的Image對象?由於您只更改images陣列的大小,因此您可以將所有已存在的指針移動到新陣列中,而無需創建任何新的Image對象。

正如我在評論中所說的,您應該絕對使用std::vector或其他來自C++標準庫的序列容器,例如std::vector<Image>。要求很差,我強烈建議進行設計更改。

1

這整個的代碼段是完全錯誤的,可以通過正好一個行是正確的更換:

images=new Image*[newmax]; 
for (int i=0;i<newmax;i++){ 
    if (newArray[i]!=NULL) { 
     images[i]=new Image; 
     *images[i]=*newArray[i]; 
    } 
    else { 
     images[i]=NULL; 
    } 

    delete newArray[i]; 
} 
delete [] newArray; 

並沒有什麼類似甚至該行出現在代碼。那麼,好的,第一行是模糊的,但只是模糊不清。