理论教育 智能指针的基础知识

智能指针的基础知识

时间:2023-06-19 理论教育 版权反馈
【摘要】:我们无需担心对象的销毁问题,智能指针的最大作用就是自动销毁不再使用的对象。下面是弱指针的示例:由此可见,智能指针用起来是很方便,在一般情况下最好使用智能指针来代替普通指针。但是需要知道一个智能指针其实是一个对象,而不是一个真正的指针,因此其运行效率是远远比不上普通指针的。所以在对运行效率要求敏感的地方,最好还是不要使用智能指针。

智能指针的基础知识

Android中定义了三种智能指针类型,分别是强指针sp、弱指针WP和轻量级指针(Light Pointer)。强指针与一般意义的智能指针概念相同,通过引用计数来记录有多少使用者在使用一个对象,如果所有使用者都放弃了对该对象的引用,则该对象将被自动销毁。

弱指针也指向一个对象,但是弱指针仅仅记录该对象的地址,不能通过弱指针来访问该对象,也就是说不能通过弱指针来调用对象的成员函数或访问对象的成员变量。要想访问弱指针所指向的对象,需首先将弱指针升级为强指针(通过wp类所提供的promote()方法)。弱指针所指向的对象是有可能在其他地方被销毁的。如果对象已经被销毁,wp的promote()方法将返回空指针,这样就能避免出现地址访问错误的情况。

究竟指针是怎么做到这一点的呢?其实一点也不复杂,原因就在于每一个可以被智能指针引用的对象,都同时被附加了另外一个weakref_impl类型的对象,这个对象负责记录对象的强指针引用计数和弱指针引用计数。这个对象是在智能指针的实现内部使用的,智能指针的使用者看不到这个对象。弱指针操作的就是这个对象,只有当强引用计数和弱引用计数都为0时,这个对象才会被销毁。

接下来分析到底该怎么使用智能指针。假设现在有一个类MyClass,如果要使用智能指针来引用这个类的对象,那么这个类需满足下列两个前提条件:

(1)这个类是基类RefBase的子类或间接子类。

(2)这个类必须定义虚构造函数,即它的构造函数需要这样定义:

满足了上述条件的类后,就可以定义智能指针,定义方法和普通指针类似。比如普通指针是这样定义:(www.daowen.com)

智能指针是这样定义:

注意不要定义成sp<MyClass>*p_obj。初学者容易犯这种错误,这样实际上相当于定义了一个指针的指针。尽管在语法上没有问题,但是最好永远不要使用这样的定义。

定义了一个智能指针的变量,就可以像普通指针那样使用它,包括赋值、访问对象成员、作为函数的返回值、作为函数的参数等。例如:

注意不要试图删除一个智能指针,即执行delete p_obj操作。我们无需担心对象的销毁问题,智能指针的最大作用就是自动销毁不再使用的对象。当不需要再使用一个对象后,只需直接将指针赋值为NULL即可。

上面说的都是强指针,弱指针的定义方法和强指针类似,但是不能通过弱指针来访问对象的成员。下面是弱指针的示例:

由此可见,智能指针用起来是很方便,在一般情况下最好使用智能指针来代替普通指针。但是需要知道一个智能指针其实是一个对象,而不是一个真正的指针,因此其运行效率是远远比不上普通指针的。所以在对运行效率要求敏感的地方,最好还是不要使用智能指针。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈