-4

我无法理解 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


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

4

3 回答 3

2

没有合理的解释。

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

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

于 2013-06-20T18:28:24.890 回答
1

因为在你做了以下之后

delete p;

您没有将 p 设置为 NULL

尝试以下

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

void allocate()
{
     ptr=new int[10];
     ptr[0] = 10;
}
于 2013-06-20T18:31:45.047 回答
0

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

于 2013-06-20T18:28:17.283 回答