Я написал простую, трудную игру тетриса с каждым блоком как экземпляр класса singleblock.C++ delete - удаляет мои объекты, но я все еще могу получить доступ к данным?
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);
}
У меня есть функция, которая сканирует по всей линии, и проходит через связанный список блоков удаление соответствующих них и переназначения -> следующие указатели.
SingleBlock *deleteBlock;
SingleBlock *tempBlock;
tempBlock = deleteBlock->next;
delete deleteBlock;
Игра работает, блоки удалены правильно, и все функционирует так, как предполагается. Однако при проверке я могу получить доступ к случайным битам удаленных данных.
Если я распечатаю каждый из удаленных единичных блоков значений «x» ПОСЛЕ их удаления, некоторые из них возвращают случайный мусор (подтверждающий удаление), а некоторые из них возвращают 222, сообщая мне, хотя деструктор назывался данными wasn ' t фактически удален из кучи. Многие идентичные испытания показывают, что всегда одни и те же конкретные блоки, которые не удаляются должным образом.
Результаты:
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', было бы« забыть »; вы на самом деле не говорите компилятору * удалять * все, что угодно * перестает заботиться о нем (и позволяя кому-то делать то, что они хотят с i) вроде как возвращать книгу в библиотеку, а не записывать ее. –