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

时间:2013-06-20 18:25:28

标签: c++ destructor undefined-behavior

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

#include<iostream>
using namespace std;

class call{
        private:
        int *ptr;

    public :
    call()
    {
    cout<<"\nConstructor called\n";
    }

    void allocate()
    {
            ptr=new int[10];
    }

    void test()
    {
            cout<<"\nTesting\n";
    }

    ~call()
     {
            if(ptr)
            {

             cout<<"\nptr deleted\n";
             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


在上面的代码中,即使删除了对象(删除p),我仍然可以访问该类的成员函数(void test())。如果删除该对象,c ++如何允许我访问该类的成员函数。

3 个答案:

答案 0 :(得分:2)

没有合理的解释。

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

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

答案 1 :(得分:1)

因为在您执行了以下操作后

delete p;

你没有将p设置为NULL

尝试以下

void test()
{
    cout<<"Testing "<< ptr[0] << "\n";
}

void allocate()
{
     ptr=new int[10];
     ptr[0] = 10;
}

答案 2 :(得分:0)

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