2013-04-04 87 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