在对对象调用 delete 后访问成员函数

Accessing member function after calling delete to an object

本文关键字:访问 成员 函数 delete 对象 调用      更新时间:2023-10-16

有人请解释一下。到目前为止,我知道,删除后我无法访问分配的内存。如果我错了,请纠正我。

#include <iostream>
using namespace std;
class A
{
    int x;
public:
    A()
    {
        x = 3;
        cout<< "Creating A" <<endl;
    }
    ~A()
    {
        cout<< "Destroying A" <<endl;
    }
    int getX()
    {
        return x;
    }
};

int main(int argc, const char * argv[])
{
    A* a = new A();
    delete a;
    cout<< a->getX()<<endl;
    return 0;
}

输出显示如下!

Creating A
Destroying A
3

我不明白删除a后如何拨打getX()

你是未定义行为的受害者。当他们说这是未定义的行为时,这意味着任何事情都可能发生,包括代码可能appear正常工作。
释放动态分配的内存时,不会擦除内存。这意味着您当前的流程不拥有它,但内容会保留在那里,直到它们被重新用于其他内容。

但是访问未分配的内存是致命的。

而且,当您通过delete a释放内存时,它会通过a释放内存帮助,但a仍在范围内,并且其生命周期直到主进程结束。
因此,您可以执行函数调用。删除内存不会破坏变量本身,但会清理变量持有的内存。非动态变量在其生存期结束时由编译器销毁。

这是一种未定义的行为,任何事情都可能发生。如果内存块尚未填充其他内容,则可能不会像您所看到的那样崩溃,但是请不要访问释放的内存!

并且不要使用原始指针,我们为此目的创建智能指针。

行为未定义。在我的实现中任何事情都可能发生,该程序显示垃圾值。实际上标准没有定义任何东西,实现可以自由选择任何东西