c++ - C++ 中的悬空指针和删除命令

标签 c++ dangling-pointer

我注意到我的 C++ 代码中有一些非常奇怪的东西。

class A
{
    public:
    void doIt(){cout<<"hello"<<endl;}
};
int main() {
    A* a=new A();
    A* b=a;
    delete a;
    b->doIt();
    return 0;
}

我认为 delete 会从堆中清除内存,而 b->doIt() 会失败。但是在运行这段代码时它可以工作,甚至可以打印“hello”。

为什么?

最佳答案

I thought that delete will erase the memory from the heap

“删除”内存的唯一方法是用锤子。

内存被标记为“未使用”并且对象在语义上被销毁。

and b->doIt() would fail

这是为什么?

没有任何机制可以为您做到这一点,在一般情况下也不存在

有责任不对不存在的对象调用函数。

实际上,它不会在这里崩溃,因为 doIt 中没有任何内容实际尝试访问对象的内存。请记住,该函数并未存储在对象“中”——它是您程序的一部分,并且您的程序仍然存在。

即使 doIt 访问和/或改变了对象的状态,只要该内存仍在事件页面中,您就仍然可能不会崩溃.这正是未定义行为被定义为不可预测的原因。

避免。


关于c++ - C++ 中的悬空指针和删除命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35480500/

相关文章:

c++ - 当我在子类中调用函数时,它会调用父类函数

c - 为什么悬空指针不能存储任何值并且为什么会抛出 0?

c++ - 内存分配栈

c++ - 如何使这个专门的功能起作用

c++ - 如何在程序启动时自动隐式创建类的实例?

c++ - 从信号处理程序中唤醒线程

rust - 在Rust中挣扎着悬而未决的引用和静态生命周期建议

c++ - 无法解释为什么在创建指针 vector 的 vector 时指针变得悬空

c++ - 当指针指向的对象被另一个类的实例删除时重新分配指针

c++ - 我可以使用全局系统 Hook 来捕获单击了哪个文件吗?