Tôi đã viết một trò chơi Tetris đơn giản, hoạt động với mỗi khối như một thể hiện của một lớp đơn.C++ delete - Nó xóa các đối tượng của tôi nhưng tôi vẫn có thể truy cập dữ liệu?
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);
}
Tôi có chức năng quét toàn bộ dòng và chạy qua danh sách các khối được liên kết xóa các liên kết và gán lại -> con trỏ tiếp theo.
SingleBlock *deleteBlock;
SingleBlock *tempBlock;
tempBlock = deleteBlock->next;
delete deleteBlock;
Hoạt động của trò chơi, các khối sẽ bị xóa chính xác và mọi chức năng như được cho là. Tuy nhiên về kiểm tra, tôi vẫn có thể truy cập các bit ngẫu nhiên của dữ liệu đã xóa.
Nếu tôi in từng giá trị "x" đã xóa sau khi xóa, một số sẽ trả về rác ngẫu nhiên (xác nhận xóa) và một số trong số chúng trả về 222, cho tôi biết ngay cả khi destructor được gọi là dữ liệu wasn ' t thực sự bị xóa khỏi heap. Nhiều thử nghiệm giống hệt nhau cho thấy nó luôn là các khối cụ thể giống nhau mà không bị xóa đúng cách.
Kết quả:
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
là việc có thể truy cập dữ liệu từ thế giới bên kia mong đợi?
Xin lỗi nếu điều này hơi dài.
Chính sách an toàn nhất là để xóa một mục khi nó không còn được sử dụng, và không bao giờ đề cập đến nó một lần nữa. Con trỏ thông minh có thể giúp khi nhiều hơn một con trỏ đang đề cập đến cùng một đối tượng trong bộ nhớ. –
Nếu bạn có thể truy cập các khối, bạn có thể xóa chúng. Thật tồi tệ. Đừng làm thế. –
Đôi khi tôi nghĩ rằng một từ khóa tốt hơn 'xóa' sẽ là' quên'; bạn không thực sự nói với trình biên dịch để * xóa * bất cứ điều gì nhiều như * ngừng quan tâm * nó (và để cho người khác làm bất cứ điều gì họ muốn với tôi) giống như trả lại một cuốn sách cho thư viện hơn là đốt nó. –