删除对象后访问成员函数?奇怪的行为需要解释
accessing member function after deleting object ? weird behaviour explanation required
我无法理解c++中的以下行为。我正在使用gcc 4.4.1
#include<iostream>
using namespace std;
class call{
private:
int *ptr;
public :
call()
{
cout<<"nConstructor calledn";
}
void allocate()
{
ptr=new int[10];
}
void test()
{
cout<<"nTestingn";
}
~call()
{
if(ptr)
{
cout<<"nptr deletedn";
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++是如何允许我访问类的成员函数的
没有合理的解释
您的代码调用未定义行为,,这意味着它不需要做任何特别的事情。它可能会崩溃,但它不需要这样做。它可以假装"工作正常",就像你的情况一样。
也许你的操作系统上的内存管理器还没有回收释放/删除的内存,仅此而已。但是你真的不应该依赖这个行为
因为在您做了以下操作之后
delete p;
您没有将p设置为NULL
试试下面的
void test()
{
cout<<"Testing "<< ptr[0] << "n";
}
void allocate()
{
ptr=new int[10];
ptr[0] = 10;
}
释放后使用指针会导致未定义行为。这意味着任何都可能发生,包括"正确行为"的出现。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 被解释为低级别const的const对象的地址
- 子类对象列表重新解释为基类对象列表?(C++11).
- 我如何向只用Fortran 77编码的人解释面向对象编程?
- 解释类对象的Gcov报告
- gcc编译错误,对象初始化被解释为函数指针
- 用于虚拟对象的Linux线程.有人能解释linux中多线程库之间的区别吗
- 关于异常对象的双重销毁需要解释
- 你会如何解释一个外行人或编程初学者,面向对象方法的大胆点 - 安全
- 删除对象后访问成员函数?奇怪的行为需要解释
- 需要解释这个Java对象初始化语法
- 使LLDB将地址重新解释为指向模板实例化类型对象的指针
- 使用reintepret_cast解释对象地址
- 有人能确切地解释一下,如果在堆上分配对象数组的过程中抛出异常,会发生什么吗
- 解释c++中非规范化双精度对象的输出
- 在c++中传递参数给对象-请解释背后的逻辑
- c++类对象宏,包含解释为注释的URL