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