首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-10-17 
为什么这个程序不报错呀(new和delete内存释放问题)C/C++ code#includeiostreamusing namespace stdclas

为什么这个程序不报错呀(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,

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

热点排行