关于空指针调用类成员能否通过的问题
2011-01-26 02:41
239 查看
因为被头问起,前阵子研究了下关于空类指针的调用是否会报错的问题。
详细的情况是这样。
空指针调用类成员,有几种情况,普通函数一旦访问类成员,则一定会抛出异常。这是绝大多数的情况。但如果函数没有访问任何类成员,这个函数调用就会成功。(估计这样的函数也不太多-_-) 静态成员函数基本等同于全局函数,所以也可以通过。而对虚函数的调用则不论是否访问类成员都会导致异常的抛出,因为虚函数要访问虚表指针。
但这些也都不是绝对的,如果所访问的类成员的偏移量超过了65535,就会越过操作系统的禁入内存区。则照样可以避开操作系统的检查而不会抛出任何异常。(注意这里指windows32位操作系统) 当然,这么大的类一般情况下其实是没有的。
但这种情况显然是不好的,改写不该改写的内存,或者读取了错误的信息,结果都将是不确定的。
无论是否能够通过,都不应该出现使用空指针的情况。
在逻辑完整正确的情况下,显然不应该出现这种情况,如果哪个程序员能犯下这种错误,那么几乎毫无疑问的,他的代码必然存在着无数的bug,等待他或他的团队的恐怕将是无穷无尽的痛苦调试。
这里只是研究一下空指针使用可能出现的情况,估计真的会犯这种错误的程序员大概不多吧。
详细的情况是这样。
空指针调用类成员,有几种情况,普通函数一旦访问类成员,则一定会抛出异常。这是绝大多数的情况。但如果函数没有访问任何类成员,这个函数调用就会成功。(估计这样的函数也不太多-_-) 静态成员函数基本等同于全局函数,所以也可以通过。而对虚函数的调用则不论是否访问类成员都会导致异常的抛出,因为虚函数要访问虚表指针。
但这些也都不是绝对的,如果所访问的类成员的偏移量超过了65535,就会越过操作系统的禁入内存区。则照样可以避开操作系统的检查而不会抛出任何异常。(注意这里指windows32位操作系统) 当然,这么大的类一般情况下其实是没有的。
但这种情况显然是不好的,改写不该改写的内存,或者读取了错误的信息,结果都将是不确定的。
无论是否能够通过,都不应该出现使用空指针的情况。
在逻辑完整正确的情况下,显然不应该出现这种情况,如果哪个程序员能犯下这种错误,那么几乎毫无疑问的,他的代码必然存在着无数的bug,等待他或他的团队的恐怕将是无穷无尽的痛苦调试。
这里只是研究一下空指针使用可能出现的情况,估计真的会犯这种错误的程序员大概不多吧。
相关文章推荐
- 关于类成员函数指针的调用问题
- 关于DialogResult.OK的“通过实例访问共享成员、常量成员、枚举成员或嵌套类型;将不计算限定表达式”的警告问题
- 关于通过不含虚析构函数的基类类型的指针删除派生类对象的问题 http://blog.csdn.net/unituniverse2/article/details/12302139
- 关于通过不含虚析构函数的基类类型的指针删除派生类对象的问题
- 关于c++类中的指针成员问题
- 关于C++中类的成员函数指针相关问题
- 关于含有指针成员的类的对象之间赋值指针的问题。
- 关于空指针类型的类变量的成员函数访问的问题
- 关于通过不含虚析构函数的基类类型的指针删除派生类对象的问题
- 关于类的静态成员函数指针的问题
- 关于数组做函数形参和指针做函数形参的问题
- 关于通过屏幕旋转确定view的layout的问题
- 关于最外层为相对布局时,通过动态设置布局内控件位置问题
- 关于“不允许指针指向不完整的类类型”问题分析
- 关于派生类拷贝构造函数中使用基类私有类对象成员的问题
- 关于C++中结构体及其指针成员的内存分配和释放
- 关于通过linux Samba共享开发模式,svn提交慢等问题
- 关于基类指针指向子类对象,构造函数和析构函数调用的顺序的问题。
- 关于类成员的初始化顺序问题
- 关于基类指针的问题