删除对象后是否访问成员函数?奇怪的行为需要解释 我无法理解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; }

删除对象后是否访问成员函数?奇怪的行为需要解释 我无法理解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; },c++,destructor,undefined-behavior,C++,Destructor,Undefined Behavior,在上面的代码中,即使删除了object(delete p),我仍然能够访问该类的成员函数(void test())。如果对象被删除,C++如何允许我访问类的成员函数。这意味着任何事情都可能发生,包括“正确行为”的出现。没有合理的解释 您的代码调用未定义的行为,,这意味着不需要执行任何特定的操作。它可以崩溃,但不需要这样做。它可以假装“工作正常”,就像你的情况一样 也许操作系统上的内存管理器还没有回收释放/删除的内存,仅此而已。但是你真的不应该依赖这种行为。因为在你做了以下事情之后 delete


在上面的代码中,即使删除了object(delete p),我仍然能够访问该类的成员函数(void test())。如果对象被删除,C++如何允许我访问类的成员函数。这意味着任何事情都可能发生,包括“正确行为”的出现。

没有合理的解释

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


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

因为在你做了以下事情之后

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

void allocate()
{
     ptr=new int[10];
     ptr[0] = 10;
}
您没有将p设置为NULL

试试下面的方法

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

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

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