我已经编写了一个简单的俄罗斯方块游戏,其中每个块都是一个类singleblock的实例。
class SingleBlock
{
public:
SingleBlock(int, int);
~SingleBlock();
int x;
int y;
SingleBlock *next;
};
class MultiBlock
{
public:
MultiBlock(int, int);
SingleBlock *c, *d, *e, *f;
};
SingleBlock::SingleBlock(int a, int b)
{
x = a;
y = b;
}
SingleBlock::~SingleBlock()
{
x = 222;
}
MultiBlock::MultiBlock(int a, int b)
{
c = new SingleBlock (a,b);
d = c->next = new SingleBlock (a+10,b);
e = d->next = new SingleBlock (a+20,b);
f = e->next = new SingleBlock (a+30,b);
}
我有一个函数,它扫描完整的一行,并遍历块的链表删除相关的块并重新分配 ->next 指针。
SingleBlock *deleteBlock;
SingleBlock *tempBlock;
tempBlock = deleteBlock->next;
delete deleteBlock;
游戏运行正常,方块被正确删除,所有功能都按照预期工作。但是检查后,我仍然可以访问已删除数据的随机位。
如果我在它们被删除之后 printf 每个已删除的单个块的 "x" 值,其中一些返回随机垃圾(确认已删除),而另一些返回 222。这告诉我尽管调用了析构函数,数据实际上并没有从堆中删除。许多相同的试验表明,总是有一些特定的块未被正确删除。
结果:
Existing Blocks:
Block: 00E927A8
Block: 00E94290
Block: 00E942B0
Block: 00E942D0
Block: 00E942F0
Block: 00E94500
Block: 00E94520
Block: 00E94540
Block: 00E94560
Block: 00E945B0
Block: 00E945D0
Block: 00E945F0
Block: 00E94610
Block: 00E94660
Block: 00E94680
Block: 00E946A0
Deleting Blocks:
Deleting ... 00E942B0, X = 15288000
Deleting ... 00E942D0, X = 15286960
Deleting ... 00E94520, X = 15286992
Deleting ... 00E94540, X = 15270296
Deleting ... 00E94560, X = 222
Deleting ... 00E945D0, X = 15270296
Deleting ... 00E945F0, X = 222
Deleting ... 00E94610, X = 222
Deleting ... 00E94660, X = 15270296
Deleting ... 00E94680, X = 222
能够从坟墓中访问数据是可以预期的吗?
如果我的表达有些冗长,那么我很抱歉。