智能指针简介
智能指针是c++ 中的一个概念,因为c++ 本身不具备垃圾回收机制,而且指针也不具备构造函数和析构函数,所以为了实现内存( 动态存储区) 的安全回收,必须对指针进行一层封装,而这个封装就是智能指针,
c++的智能指针有很多实现方式,有auto_ptr , unique_ptr , shared_ptr 三种,还有其他的。
android 中的sp 句柄类实际上就是google 实现的一种强引用的智能指针。
Android 中封装了sp<> 强指针,wp<>弱指针的操作。
1 . 强指针与一般意义的智能指针概念相同,通过引用计数来记录有多少使用者在使用一个对象,
如果所有使用者都放弃了对该对象的引用,则该对象将被自动销毁。
2 . 弱指针也指向一个对象,但是弱指针仅仅记录该对象的地址,不能通过弱指针来访问该对象,
也就是说不能通过弱智真来调用对象的成员函数或访问对象的成员变量。(这里不讨论弱指针,仅讨论强指针)
智能指针的使用
假设现在有一个类MyClass,如果要使用智能指针来引用这个类的对象,那么这个类需满足下列两个前提条件:
(1) 这个类是基类RefBase的子类或间接子类;
(2) 这个类必须定义虚构造函数,即它的构造函数需要这样定义:
virtual ~MyClass();
满足了上述条件的类就可以定义Android智能指针了,定义方法和普通指针类似。比如普通指针是这样定义:
MyClass* p_obj;
Android智能指针是这样定义:
sp< MyClass> p_obj;
注意不要定义成 sp< MyClass>* p_obj。初学者容易犯这种错误,这样实际上相当于定义了一个指针的指针。尽管在语法上没有问题,但是最好永远不要使用这样的定义。
定义了一个智能指针的变量,就可以象普通指针那样使用它,包括赋值、访问对象成员、作为函数的返回值、作为函数的参数等。比如:
p_obj = new MyClass();
// 注意不要写成 p_obj = new sp< MyClass>
sp< MyClass> p_objp_obj2 = p_obj;
p_obj->func();
p_obj = create_obj();
some_func(p_obj);
注意不要试图delete一个Android智能指针,即 delete p_obj。不要担心对象的销毁问题,智能指针的最大作用就是自动销毁不再使用的对象。不需要再使用一个对象后,直接将指针赋值为NULL即可:
p_obj = NULL;
上面说的都是强指针,弱指针的定义方法和强指针类似,但是不能通过弱指针来访问对象的成员。下面是弱指针的示例:
wp< MyClass> wp_obj = new MyClass();
p_obj = wp_obj.promote();
// 升级为强指针。不过这里要用.而不是->,真是有负其指针之名啊
wp_obj = NULL;
Android智能指针用起来是很方便,在一般情况下最好使用智能指针来代替普通指针。但是需要知道一个智能指针其实是一个对象,而不是一个真正的指针,因此其运行效率是远远比不上普通指针的。所以在对运行效率敏感的地方,最好
还是不要使用智能指针为好