【发布时间】: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++ 如何允许我访问该类的成员函数。
【问题讨论】:
-
重复数百次。
-
@CarlNorum 我总是想知道是什么导致人们尝试错误的事情然后寻求合理的解释......
-
在这种情况下它不是一个空实例,但这也是一个很好的信息,并且释放的指针类似于空指针,因为您当然不应该对它们进行操作。
-
如果我在 main() p->allocate() 中按以下顺序调用会好吗? p->测试(); p->~call(); p->~call(); p->~call();删除 p;
标签: c++ destructor undefined-behavior