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

标签 c++ pointers undefined-behavior delete-operator c++-faq

我编写了一个简单的、有效的俄罗斯方 block 游戏,其中每个 block 都作为类单 block 的实例。

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);
}

我有一个函数可以扫描完整的行,并遍历 block 的链接列表,删除相关的 block 并重新分配 ->next 指针。

SingleBlock *deleteBlock;
SingleBlock *tempBlock;

tempBlock = deleteBlock->next;
delete deleteBlock;

游戏正常运行,方 block 被正确删除,一切正常运行。但是经过检查,我仍然可以访问已删除数据的随机位。

如果我在删除后打印每个已删除的单 block “x”值,其中一些返回随机垃圾(确认删除),其中一些返回 222,告诉我即使调用了析构函数,数据也不是实际上从堆中删除。许多相同的试验表明,没有正确删除的总是相同的特定 block 。

结果:

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

是否能够从预期之外的坟墓中访问数据?

对不起,如果这有点啰嗦。

最佳答案

Is being able to access data from beyond the grave expected?

这在技术上称为 Undefined Behavior .如果它也为您提供一 jar 啤酒,请不要感到惊讶。

关于C++ 删除 - 它删除了我的对象,但我仍然可以访问数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1930459/

相关文章:

c++ - 消除非常量和常量访问方法的歧义 (Pybind11)

c++ - OpenCV 取像素颜色值

C++知识产权保护/反逆向

c++ - quickfix 会自动响应测试请求消息吗?

c - 我的程序输出未在 C 中更新

c - 将一个结构体分配给 C 结构体中的另一个结构体

c - 设置值等于自身

c++ - 手动定义的 strlen 的奇怪行为

没遇到过的C错误

c++ - 定义未定义的行为