2016-12-10 28 views
0

我在C++中的代碼中遇到問題。 我有我使用和,特別是,其方法GetAllCreaturesByLevel定義如下一類數據結構:類中的值在返回主函數時被破壞C++

Class DataStructure; 
StatusType DataStructure::GetAllCreaturesByLevel(int magiID, int **creatures, int *numOfCreatures); 

這種方法從main函數接收指針和還給一些統計一下正在工作的對象。

要從主函數使用此方法,我調用一個函數,它將傳遞來自主函數的指針,將對象從void *轉換爲DataStructure *並調用其方法GetAllCreaturesByLevel。此功能定義如下:

StatusType GetAllCreaturesByLevel(void *DS, int magiID, int **creatures, int *numOfCreatures){ 
    if((DS == NULL)||(creatures == NULL)||(magiID == 0)||(numOfCreatures == NULL)){ 
     return INVALID_INPUT; 
     } 
    return ((DataStructure*)DS)->GetAllCreaturesByLevel(magiID, creatures, numOfCreatures); 
} 

該代碼在此函數中完美工作。問題是什麼時候回到main:指針返回正確的值,但對象中的所有數據都被改變並轉換爲垃圾值。

這個錯誤的原因是什麼?

+0

哪個對象被破壞?一個'DatStructure'類型或'StatusType'類型之一? – RomCoo

+0

被銷燬的對象是DataStructure * one(作爲void *傳遞)。 StatusType只是一個枚舉,它提供了有關函數的最後一個問題(成功,失敗,allocation_error)的一些信息。奇怪的是Destructor似乎並沒有被使用。 – Yaklefak

+0

爲什麼在C++中使用void指針和**數組?如果你真的用C語言編程,你需要**傳遞值,或者尊重那些你想改變的值。就目前而言,這個函數試圖將主值範圍內的值改變,原始垃圾值仍然存在,因爲它們永遠不會改變。 – NonCreature0714

回答

0

在該方法我使用:

int *creaturesArray = new int[*numOfCreatures]; 

並進入生物數組中的值:

for(int i = 0; i < *numOfCreatures; i++) { 
    creatures[i] = &creaturesArray[i]; 
} 

的問題是在裝配。在從GetAllCreaturesByLevel返回主體時,堆棧比進入函數時大,因此DS不在堆棧中的相同位置。因此,放入DS的值不是真實值,而是生物陣列中的地址之一。

的解決方案是:

int *creatures = new int[*numOfCreatures]; 

並原樣返回生物,而無需使用在途中另一個陣列。