2014-12-21 89 views
1

創建2d陣列生物類指針:如果我得到std :: bad_alloc該怎麼辦?

try{ 
    world = new Organism**[worldSizeX]; 

    for (int x = 0; x < worldSizeX; x++){ 
     world[x] = new Organism*[worldSizeY]; 

     // INITATES world ARRAY 
     for (int y = 0; y < worldSizeY; y++){ 
      world[x][y] = new Organism; 
     } 
     // !INITATES world ARRAY 
    } 
} 
catch (std::bad_alloc){ 
    std::cout << "Not enough memory for World size" << worldSizeX << "x" << worldSizeY << std::endl; 
    deleteWorld(); // DO I NEED THIS? 
    init((int)worldSizeX/2, (int)worldSizeY/2, ants, beetles); 
    return; 
} 

如果我有bad_alloc我想調用初始化較小的INT值。我是否需要delete失敗的陣列,或者我可以運行它嗎?如果是的話,那麼我怎麼能刪除它,我無法循環整個數組應用程序只是崩潰。

+0

無論如何,new []或new []都需要'delete'或'delete []'來擺脫它。 –

回答

3

的原因,你的程序崩潰,當您嘗試deleteWorld析構函數會被自動調用是因爲你的陣列沒有完全初始化。因此,您可能在此過程中遇到未初始化的指針。

爲了避免這種情況,零初始化您的數組:

world = new Organism**[worldSizeX](); 

(注意尾隨(),這表示所述陣列的零初始化)。

現在,當您執行deleteWorld時,您將不得不跳過任何爲NULL的條目。

最後:是的,當你得到bad_alloc時你必須刪除所有的東西:一些對象可能已經被分配了,所以如果你沒有先釋放分配,那麼你將有內存泄漏。

+0

由於'delete NULL'是合法的,所以你不需要跳過零指針。你可以刪除它們。 –

+0

@ZanLynx:除了數組元素是指向數組的指針,所以通過「跳過」我的意思是「不要在一個NULL指針內迭代」。 – nneonneo

2

如果你使用矢量那麼這樣你就不會需要它,你的程序將不會泄漏

try{ 
    vector< vector <Organism> >world; 
    world.resize(worldSizeX); 

    for (int x = 0; x < worldSizeX; x++){ 
     world[x] = vector<Organism>(worldSizeY);//this calls the default constructor so you don't need the second for loop 
    } 
} 
catch (std::bad_alloc){ 
    std::cout << "Not enough memory for World size" << worldSizeX << "x" << worldSizeY << std::endl; 
    init((int)worldSizeX/2, (int)worldSizeY/2, ants, beetles); 
    return; 
} 
+0

如果它只是有機體***世界; ? – Cirvis

+0

'world.reserve(worldSizeX);'應該是'world.resize(worldSizeX);' – sgarizvi

+0

發佈了代碼,告訴我你是否面臨問題。一般在C++中不要使用new,使用vector。它更簡單,您不必處理內存管理問題。 – Gabriel

相關問題