删除对象后访问成员函数?奇怪的行为需要解释

accessing member function after deleting object ? weird behaviour explanation required

本文关键字:解释 对象 访问 成员 函数 删除      更新时间:2023-10-16

我无法理解c++中的以下行为。我正在使用gcc 4.4.1

#include<iostream>
using namespace std;
class call{
        private:
        int *ptr;
    public :
    call()
    {
    cout<<"nConstructor calledn";
    }
    void allocate()
    {
            ptr=new int[10];
    }
    void test()
    {
            cout<<"nTestingn";
    }
    ~call()
     {
            if(ptr)
            {
             cout<<"nptr deletedn";
             delete [] ptr;
                     ptr=NULL;
            }
      }
};


int main()
{
    call *p=new call();
    p->allocate();
    p->test();
    delete p;
    p->test();
    p->test();
    p->allocate();
    p->test();
    p->test();
return 0;
}
输出:

Constructor called
Testing
ptr deleted
Testing
Testing
Testing
Testing


在上面的代码中,即使在删除对象(delete p)之后,我仍然能够访问类的成员函数(void test())。如果对象被删除,c++是如何允许我访问类的成员函数的

没有合理的解释

您的代码调用未定义行为,,这意味着它不需要做任何特别的事情。它可能会崩溃,但它不需要这样做。它可以假装"工作正常",就像你的情况一样。

也许你的操作系统上的内存管理器还没有回收释放/删除的内存,仅此而已。但是你真的不应该依赖这个行为

因为在您做了以下操作之后

delete p;

您没有将p设置为NULL

试试下面的

void test()
{
    cout<<"Testing "<< ptr[0] << "n";
}
void allocate()
{
     ptr=new int[10];
     ptr[0] = 10;
}

释放后使用指针会导致未定义行为。这意味着任何都可能发生,包括"正确行为"的出现。