【问题标题】:accessing member function after deleting object ? weird behaviour explanation required [duplicate]删除对象后访问成员函数?需要奇怪的行为解释[重复]
【发布时间】:2013-06-17 17:54:00
【问题描述】:

我无法理解 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++ 如何允许我访问该类的成员函数。

【问题讨论】:

  • 这里有很好的答案:stackoverflow.com/questions/6441218/…
  • 重复数百次。
  • @CarlNorum 我总是想知道是什么导致人们尝试错误的事情然后寻求合理的解释......
  • 在这种情况下它不是一个空实例,但这也是一个很好的信息,并且释放的指针类似于空指针,因为您当然不应该对它们进行操作。
  • 如果我在 main() p->allocate() 中按以下顺序调用会好吗? p->测试(); p->~call(); p->~call(); p->~call();删除 p;

标签: c++ destructor undefined-behavior


【解决方案1】:

没有合理的解释。

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

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

【讨论】:

  • 如果我在 main() p-&gt;allocate(); p-&gt;test(); p-&gt;~call(); p-&gt;~call(); p-&gt;~call(); delete p; 中按以下顺序调用会好吗?
【解决方案2】:

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

delete p;

你没有将 p 设置为 NULL

试试下面的

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 2014-03-08
      • 2016-07-15
      相关资源
      最近更新 更多