我注意到我的 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/