为什么这个程序不报错呀(new和delete内存释放有关问题)

为什么这个程序不报错呀(new和delete内存释放问题)
C/C++ code
#include<iostream>
using namespace std;
class Base
{
      public:
             Base()
             {
                   cout<<"Base"<<endl;
             }
             void Disp()
             {
                  cout<<"display"<<endl;
             }
};

Base* f()
{
   Base *pBase= new Base();
   delete pBase;//在这句后面加上pBase = NULL;也能正常运行。
   return pBase; 
}
int main()
{
    Base* a=f();
    a->Disp();
    return 0;
} 


为什么这个程序能正常运行呢?已经delete了,就不应该返回正确的地址了呀,而且就算我在delete后面加上pBase=NULL;也还能正确返回,这是为什么呢?求教。

------解决方案--------------------
C++中,一个类的function有三种:

nonstatic
static
virtual

前两者在内部模型中拥有完全独立的地址。我们对一个A class object进行调用

a.f()
pa->f()

实际上,在compile-time被转换成

___A_@xxf( &a );
___A_@xxf( pa );

这样的形式。上面的函数名被compiler进行了name mangling处理(每个编译器的取名方式不同),脱离了C++的类外衣,变成了纯C的表达。传入的就是对于类概念来说的this指针。如果两个函数中没有用到这个this,&a和pa在内部就会被忽略——就算是传入了NULL或者非法值,也没关系。

同理,

a->Disp()

会变成类似__Base_@xxDisp( a )

这样的形式,这个方法,因为没有访问成员变量,也就忽略了this指针。这导致了看似不正确的调用却安然无恙。

在C++standard引入static member function之前,对于static data member的访问,很多程序员喜欢用

( (A*) 0 )->f();

这样的形式——就是基于这个原因。
------解决方案--------------------
baichi4141,

“要么严格按照标准规定的语法写程序不越雷池一步,要么系统学习汇编语言和编译原理。”

这一点很赞同,其实踏实深入的学习一下是非常好的,学习C++是漫长的过程。切忌浮躁:)

generalhking,

理论其实非常简单,没有很难得东西,关键是你能不能找到这些理论并记住它。