मैंने प्रत्येक ब्लॉक के साथ एक वर्ग एकल ब्लॉक के उदाहरण के रूप में एक सरल, काम कर रहे टेट्रिस गेम लिखा है। > अगला संकेत -सी ++ हटाएं - यह मेरी ऑब्जेक्ट हटा देता है लेकिन मैं अभी भी डेटा तक पहुंच सकता हूं?
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 लौटते हैं, मुझे बताते हैं कि विनाशक को डेटा कहा जाता था, वास्तव में ढेर से हटा दिया नहीं है। कई समान परीक्षण दिखाते हैं कि यह हमेशा एक ही विशिष्ट ब्लॉक होता है जो ठीक से हटाया नहीं जाता है।
परिणाम:
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
कब्र की उम्मीद से परे का डेटा एक्सेस करने में सक्षम होने है?
क्षमा करें अगर यह थोड़ा लंबा हवादार है।
सबसे सुरक्षित नीति जब यह नहीं रह गया है प्रयोग किया जाता है एक आइटम को हटाने के लिए है से लिया, और फिर कभी नहीं कहते हैं। स्मार्ट पॉइंटर्स मदद कर सकते हैं जब एक से अधिक सूचक स्मृति में एक ही वस्तु का जिक्र कर रहे हैं। –
यदि आप ब्लॉक तक पहुंच सकते हैं, तो आप उन्हें पुनः हटा सकते हैं। यह बुरी बात है। ऐसा मत करो –
कभी-कभी मुझे लगता है कि 'हटाएं' से बेहतर कीवर्ड 'भूल' होगा; आप वास्तव में कंपाइलर को * हटाने * के बारे में कुछ भी नहीं बता रहे हैं * इस बारे में परवाह करना बंद करें (और किसी और को जो भी चाहते हैं उसे करने दें) जैसे कि इसे जलाने के बजाय लाइब्रेरी में एक पुस्तक लौटाना। –