He escrito un juego de tetris simple y funcional con cada bloque como una instancia de un bloque individual de clase.C++ delete - ¿Elimina mis objetos pero todavía puedo acceder a los datos?
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);
}
que tienen una función que analiza en busca de una línea completa, y se ejecuta a través de la lista enlazada de bloques de eliminación de los relevantes y la reasignación de los -> Siguiente punteros.
SingleBlock *deleteBlock;
SingleBlock *tempBlock;
tempBlock = deleteBlock->next;
delete deleteBlock;
El juego funciona, los bloques se eliminan correctamente y todo funciona como se supone que debe. Sin embargo, en la inspección, todavía puedo acceder a los bits aleatorios de los datos eliminados.
Si imprimo cada uno de los valores eliminados de los bloques individuales "x" DESPUÉS de su eliminación, algunos devuelven basura aleatoria (confirmando la eliminación) y algunos devuelven 222, diciéndome que aunque el destructor se llamó datos wasn ' t en realidad eliminado del montón. Muchos ensayos idénticos muestran que siempre son los mismos bloques específicos que no se eliminan correctamente.
Los resultados:
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
es ser capaz de acceder a los datos desde el más allá de esperar?
Lo siento si esto es un poco largo aliento.
La política más segura es eliminar un elemento cuando ya no se utiliza, y nunca se refieren a ella de nuevo. Los Smart Pointers pueden ayudar cuando más de un puntero se refiere al mismo objeto en la memoria. –
Si puede acceder a los bloques, puede volver a eliminarlos. Eso es malo. No lo hagas –
A veces creo que una palabra clave mejor que 'borrar 'hubiera sido' olvidar'; en realidad no le está diciendo al compilador que * elimine * nada tanto como * deje de preocuparse por * it (y deje que otra persona haga lo que quiera con i) como devolver un libro a la biblioteca en lugar de quemarlo. –