C+删除-它删除我的对象,但我仍然可以访问数据?

C+删除-它删除我的对象,但我仍然可以访问数据?

我编写了一个简单的、工作的俄罗斯方块游戏,每个块作为类单块的实例。

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

是否能够访问预期之外的数据?


对不起,如果这是一个长的喘息。


翻翻过去那场雪
浏览 450回答 3
3回答

收到一只叮咚

是否能够访问预期之外的数据?这在技术上被称为未定义的行为。如果它也给你一罐啤酒,也不要感到惊讶。

呼唤远方

是否能够访问预期之外的数据?在大多数情况下,是的。调用DELETE并不会使内存为零。请注意,未定义行为。使用某些编译器,可以对内存进行零化。当您调用DELETE时,所发生的情况是内存被标记为可用,所以下次有人这样做时新的,可以使用内存。如果考虑到这一点,这是合乎逻辑的-当您告诉编译器您不再对内存感兴趣时(使用删除),为什么计算机要花时间对其进行归零。

江户川乱折腾

这就是C+所称的未定义行为-您可能能够访问数据,但可能无法访问。无论如何,这是错误的做法。
打开App,查看更多内容
随时随地看视频慕课网APP