A、在这里说明下,android中sp为强指针(sp==IServiceManager*),wp为弱指针。而在C++中,指针有两个头痛的问题,一是忘记释放动态申请的对象从而造成内存泄露;二是对象在一个地方释放后,又在别的地方被使用,从而引起内存访问错误。而android中有智能指针,可以动态的自动释放内存(类似JAVA的垃圾回收),这样就不需要再调用delete来释放对象了,android智能指针类型就分为强指针与弱指针
B、强指针是通过引用计数来记录有多少使用者在使用一个对象,如果所有使用者都放弃了对该对象的引用,则该对象将被自动销毁;而弱指针也指向一个对象,但是弱指针仅仅记录该对象的地址,不能通过弱指针来访问该对象,要想访问弱指针所指向的对象,需首先将弱指针升级为强指针(通过wp类所提供的promote()方法)。弱指针所指向的对象是有可能在其它地方被销毁的,如果对象已经被销毁,wp的promote()方法将返回空指针,这样就能避免出现地址访问错的情况。也就是说对象本身会增加一个弱引用计数,同时WP还包含m_ref指针,用于wp升级为sp时使用。事实上我们对wp的唯一操作就是将其升级为sp,然后判断升级成不成功,如果成功说明该对象存在,如果不成功说明该对象已经释放掉了
C、关于指针使用
【1】加入有个类MyClass,需要使用智能指针来引用这个类对象,则该类满足两个条件:
(1)此类必须是RefBase的子类或间接子类
(2)此类必须定义虚拟构造函数,如:virtual ~MyClass();
【2】满足条件后,普通指针定义:MyClass* p_obj; 智能指针定义:spp_obj;(注意不是sp *p_obj,牢记sp就约等同于MyClass*) 。
【3】定义指针变量后,就可以像普通指针一样进行对变量的操作了。如:
p_obj=newMyClass();// 注意不要写成p_obj=newsp<MyClass>
p_obj->func();
【4】用完以后不要delete,因为智能指针会自动帮你销毁掉,用完一个对象后,只需要p_obj=NULL; 即可
【5】上面是定义一个sp,而定义一个wp并进行操作呢
wp<MyClass>wp_obj=newMyClass();
p_obj=wp_obj.promote();// 升级为强指针。不过这里要用.而不是->、
p_obj->func();
wp_obj=NULL;
【6】说明:如果是第一次引用sp<MyClass>对象,则会调用MyClass的onFirstRef方法。
网友评论