2013-01-20 162 views
0

我正在使用双指针,但是当我尝试删除它时,它会导致堆损坏:CRT检测到应用程序在堆结束后写入内存。据“崩溃”的对象的析构函数中:删除双指针导致堆损坏

Map::~Map() 
{ 
    for(int i = 0; i < mTilesLength; i++) 
     delete mTiles[i]; 

    delete[] mTiles; 
} 

mTiles声明是这样的:

Tile **mTiles = NULL; 
mTiles = new Tile *[mTilesLength]; 

for(int i = 0; i < mTilesLength; i++) 
    mTiles[i] = new Tile(...); 

如果显着mTiles是“砖”的对象,从对象“雪碧”继承所有3个析构函数都被设置为虚拟(地图,磁贴,精灵),并不确定这是否有所作为,但似乎直到现在才起作用。

+6

您的班级是否遵循三项规则? – chris

+3

你能构建一个最小化的完整测试用例来证明这个问题吗?你发布的代码没有问题,所以问题在于别处。 – NPE

+2

FWIW,您显示的语法是正确的。 –

回答

1

您发布的代码似乎没有任何问题。我创建从它包含了一个简单的,自我,编译(正确)例如:

struct Tile {int x; Tile():x(7) {}}; 

struct Map { 
    Tile **mTiles; 
    int mTilesLength; 
    Map(int TilesLength_); 
    ~Map(); 
}; 
Map::~Map() 
{ 
    for(int i = 0; i < mTilesLength; i++) { 
    delete mTiles[i]; 
    } 

    delete[] mTiles; 
} 
Map::Map(int TilesLength_): 
    mTiles(), 
    mTilesLength(TilesLength_) 
{ 
    mTiles = new Tile *[mTilesLength]; 

    for(int i = 0; i < mTilesLength; i++) { 
    mTiles[i] = new Tile(); 
    } 
} 
int main() { 
    Map* m = new Map(1000); 
    delete m; 
} 

compiled and ran it < - 链接,并没有什么不好被发现。

你的问题在于你没有与我们分享的代码。为了找到导致问题的代码并提出正确的问题,请到这里:http://sscce.org/

然后拿起你的代码,并开始修剪零件,直到代码变得简单,但仍然显示你的堆损坏。在修剪掉不相关的代码时保留每个版本的副本,这样您就不会跳过问题发生的部分(这是您希望版本控制系统即使在您的个人项目上的许多原因之一)。

+0

用于提及VCS –