2013-04-04 94 views
0
ppTile = new Tile*[tileN]; 
    for(int x=0; x<tileN; x++) 
    { 
     ppTile[x] = new Tile(Tile::TileType(pCData->GetdefaultTile()), 
          ((x*2)+1) % (mapSize+(mapSize-1)), 
          (x/ ((float)mapSize-0.5))+1, 
          pCData->GetdefaultHeight() 
          ); 
    } 

我該如何刪除Tile *和Tile對象的數組?刪除指針數組及其對象的正確方法是什麼?

編輯:這是我的猜測:

Map::~Map() 
{ 
    if(ppTile) 
    { 
     for(int x=0; x<mapSize*(mapSize-1); x++) 
     { 
      delete ppTile[x]; 
     } 
     delete[] ppTile; 
    } 
} 

是嗎?

+3

你確實需要指向'Tile'的指針嗎?這聽起來像一個'std :: vector '可能會工作。 – chris 2013-04-04 21:46:58

+0

將所有'Tile'對象'逐個刪除',然後'delete []'數組。 – jrok 2013-04-04 21:47:37

+0

哦,並確保你知道三/五的規則。它會咬你,如果你不是,你選擇不使用RAII。 – chris 2013-04-04 21:56:14

回答

4

你迭代通過Tile* s和delete每一個,然後你delete[]大的一個。

for(int x=0; x<tileN; x++) 
{ 
    delete ppTile[x]; 
} 
delete[] ppTile; 

一個好的經驗法則是爲每個new一個delete,併爲每一個new[]delete[]

只需使用智能指針的std::vector即可避免麻煩。

根據您的編輯:

我將避免檢查if(ppTile)。在NULL指針上調用delete是明確定義的,但檢查也容易出錯 - 如果該指針是NULLmapSize*(mapSize-1)不是0,則會隱藏邏輯錯誤。

+0

不應該'刪除[] ppTile'或我誤解了? – Jengerer 2013-04-04 21:49:27

+0

@Jengerer你是對的:)排字錯誤 – 2013-04-04 21:49:47

+0

雖然我沒有發現這太麻煩,那麼仍然會更喜歡使用std :: vector?如果是這樣,爲什麼?謝謝你的方式。 – 2013-04-04 21:49:56