NULL对象指针
来源:互联网 发布:邦奇威尔斯数据 编辑:程序博客网 时间:2024/06/01 10:28
如果一个对象的指针p是NULL,通过p->SomeFunction()的形式调用成员函数。是否会出错?
答案是调用本身不会出错,函数内部是否会出错取决于是否会直接或间接访问成员变量。可以参考下面的例子代码。如果把CDemo* p1 = NULL;改成CDemo* p1 = new CDemo就不会有错误了。
Example
class CDemo{public: void DoNotAccessMember() { printf("Do Not Access Memeber variable. Class pointer = %x/r/n", this); } void AccessMember() { printf("Access Memeber variable. Class pointer = %x/r/n", this); int i = m_i; //Access this->m_i error printf("After access Memeber variable. Class pointer = %x/r/n", this); }private: int m_i;};int main(void){ try { CDemo* p1 = NULL; p1->DoNotAccessMember(); printf("DoNotAccessMember sucessfully/r/n"); p1->AccessMember(); printf("AccessMember sucessfully/r/n"); } catch(...) { printf("Access exception/r/n"); } return 0;}
Display
Do Not Access Memeber variable. Class pointer = 0DoNotAccessMember sucessfullyAccess Memeber variable. Class pointer = 0Access exception
Reason
根本原因与C++对象的生成方式有关。C++编译器会为每一个对象分配独立的数据空间。也就是同一个类的不同对象的成员变量各自独立。但是,所有的对象会共享一个类的函数入口表。区分调用函数的具体对象的方式,使编译器自动把对象指针隐式传递给每一个成员函数作为参数,也就是this。对于pointer->function(),pointer的值会传给function;对于object.function,object的的地址会传给function。所以,即使pointer是一个无效指针,如果没有访问成员变量,是不会出错的。但是当试图访问成员变量时,this->variable指向了无效内存地址,就会遭成内存访问异常。
- NULL对象指针
- 对象删除后,指针要赋值NULL
- 值为NULL的对象指针
- NULL指针
- NULL指针
- NULL指针
- null指针
- NULL指针
- NULL指针
- NULL指针
- 对象指针为NULL,为什么还是可以调用成员函数
- null 对象
- 当C++指向对象的指针被赋值为NULL,对象那些函数可以运行?
- 当C++指向对象的指针被赋值为NULL,对象那些函数可以运行?
- NULL指针与空指针
- NULL 空指针 野指针
- void指针与NULL指针
- NULL 空指针
- BSTR详解四 - BSTR包容类
- .net发展前景
- 消息钩子函数入门
- VC常用数据类型使用转换详解
- BSTR详解五 - BSTR与其它字符串类型转换
- NULL对象指针
- 每日一句2007-01-10
- 数据库连接、设计以及备份技巧集锦
- Web2.0概述
- Ready Go!
- 端口转发程序基本实现代码(望高手给建议)
- 搬家公告1/18
- javascript ---各对象,属性,方法 解释
- ftp