Я написал простую работающую игру тетрис, в которой каждый блок является экземпляром класса 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;
Игра работает, блоки удаляются корректно и все работает как положено. Однако при проверке я все еще могу получить доступ к случайным битам удаленных данных.
Если я распечатаю значения «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
Ожидается ли возможность доступа к данным из загробного мира?
Извините, если это немного затянуто.
delete
, было быforget
; на самом деле вы не говорите компилятору удалить что-либо, а перестать заботиться об этом (и позволяете кому-то другому делать с i все, что они хотят), вроде как вернуть книгу в библиотеку, а не сжигать ее. - person Dan Tao   schedule 18.12.2009