为什么这个程序不报错呀(new和delete内存释放有关问题)
为什么这个程序不报错呀(new和delete内存释放问题)
为什么这个程序能正常运行呢?已经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,
理论其实非常简单,没有很难得东西,关键是你能不能找到这些理论并记住它。
- 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,
理论其实非常简单,没有很难得东西,关键是你能不能找到这些理论并记住它。