关于空指针类型的类变量的成员函数访问的问题
2011-12-09 00:26
423 查看
下面代码会有什么输出?
fun输出fun,
vfunc爆异常错误
---------------------------------------------
为什么有这样的结果?
从c++ 对象模型中知道,类的非虚成员函数和普通c的成员函数没有什么区别,而数据成员是每个类的实例化对象独享,虚函数会放在一个vptr指针指向的表,那个表存有函数的入口地址.
比如 上述的func() 可能会有这个形式:
void func(A* this)
{}
2. 在编译的时候,func这个函数直接会被汇编到text段里面,加载到内存后,其地址及入场等等信息都是完整存在的.
我们在main你们调用这个函数的这句代码会直接引用到text段里面函数对于的地址,这个值可以说是死的。所以对象即便为空也是没关系的.
3.虚函数的地址虽然也和一般函数一样在内存中加载了,但是虚函数不是在编译时刻求值的,而是动态时刻。这个动态时刻的概念就是,作为入参或者类的继承类型的实例化地址对应的具体函数的地址.通过visual studio或gcc反汇编代码,会发现往往都是在类对象实例化的时候,在构造函数里面插入的。这个地方 a这个指针显然没有new从而没有调用构造函数,所以看其vptr指针(vs貌似叫做vftable)可以肯定地址是空的.所以会爆错!
4.如果a作为栈变量或者堆类型new出肯定都是不会爆错!
#include <iostream> using namespace std; class A { public: void fun() { cout<<"fun"<<endl; } virtual void vfun() { cout<<"vfun"<<endl; } private: int a; }; int main() { A *a = NULL; a->fun(); a->vfun(); system("pause"); return 0; }
fun输出fun,
vfunc爆异常错误
---------------------------------------------
为什么有这样的结果?
从c++ 对象模型中知道,类的非虚成员函数和普通c的成员函数没有什么区别,而数据成员是每个类的实例化对象独享,虚函数会放在一个vptr指针指向的表,那个表存有函数的入口地址.
比如 上述的func() 可能会有这个形式:
void func(A* this)
{}
2. 在编译的时候,func这个函数直接会被汇编到text段里面,加载到内存后,其地址及入场等等信息都是完整存在的.
我们在main你们调用这个函数的这句代码会直接引用到text段里面函数对于的地址,这个值可以说是死的。所以对象即便为空也是没关系的.
3.虚函数的地址虽然也和一般函数一样在内存中加载了,但是虚函数不是在编译时刻求值的,而是动态时刻。这个动态时刻的概念就是,作为入参或者类的继承类型的实例化地址对应的具体函数的地址.通过visual studio或gcc反汇编代码,会发现往往都是在类对象实例化的时候,在构造函数里面插入的。这个地方 a这个指针显然没有new从而没有调用构造函数,所以看其vptr指针(vs貌似叫做vftable)可以肯定地址是空的.所以会爆错!
4.如果a作为栈变量或者堆类型new出肯定都是不会爆错!
相关文章推荐
- php关于private、public成员变量访问问题
- this指针访问成员函数问题
- C++中静态成员函数访问成员变量问题
- this指针访问成员函数问题
- C++中静态成员函数访问成员变量问题
- C++中线程函数中方访问成员变量的问题
- C++关于参数为const引用类型的函数调用参数成员函数的一个问题
- C++利用类静态变量,实现伪类对象空指针成功访问含有成员变量的成员函数而不崩溃
- 关于指向空的对象指针可以访问类的不包含成员变量的成员函数的原因
- 关于指针作为函数参数传递的理解,对比普通变量作为函数参数的需注意点,其实就是行参和实参的问题。
- 关于C++中类的成员函数指针相关问题
- 关于Visual Assistant X助手在定位函数及结构体成员变量不准确的问题
- 指向成员函数的指针类型成员变量
- C++中静态成员函数访问成员变量问题
- C++中静态成员函数访问成员变量问题
- 关于结构指针类型数组做函数参数的一个问题#include<stdio.h>typede
- 关于类的静态成员函数指针的问题
- public protected private 成员函数和成员变量在public protected private 继承后访问权限问题
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。
- 注意访问器中的一个小细节,关于有访问器没有成员变量的问题