搜索
写经验 领红包

adoid系统智能指针中轻量级指针有哪些(adoid智能指针)

导语:Android系统智能指针中轻量级指针

lp、sp、wp在Android Native层中被大量使用,所以非常有必要学习它们的实现原理。lp是Light Pointer的缩写,表示轻量级指针,sp是Strong Pointer的缩写,表示强指针,wp是Weak Pointer的缩写,表示弱指针。在Android系统中,智能指针包括轻量级指针lp(Light Pointer)、强指针sp(Strong Pointer)和弱指针wp(Weak Pointer)这三种。但无论是轻量级指针、强指针还是弱指针,它们的实现原理都一样,即都由对象本身来作为引用计数值,但是对象本身不会去维护这个引用计数值,而是由智能指针来维护。

那么为什么Android中要实现这个智能指针呢?

我们都知道,在Native开发中,如果new了一个对象,使用完之后忘记delete该对象,就会造成内存泄漏。即使没有忘记delete这个对象,也有可能delete了它之后,其他地方还继续使用原来指向它的指针,造成系统崩溃。

为了避免这两个问题,Android系统的智能指针就出现了。它的做法是:使用引用计数的方法,每当有一个指针指向一个新new出来的对象时,就对该对象的引用计数值增加1,每当有一个指针不再使用这个对象时,就对该对象的引用计数值减少1,当减1之后,如果发现引用计数值为0,就delete该对象,这样就避免了忘记delete对象或者这个对象被delete之后还在其他地方使用的问题。而加1和减1的工作就是由Android的智能指针来做的。我们知道,在C++中,对象的创建和消亡会分别调用它的构造函数和析构函数,所以加1和减1的工作,实际上就放到了智能指针对象的构造函数和析构函数里,这也是称这个指针对象为智能指针的原因。

轻量级指针(lp)它的源代码定义如下:

变量mCount是引用计数值,初始值为0,而incStrong()函数和decStrong()函数就是用于维护引用计数器值。incStrong()函数中调用android_atomic_inc()函数加1操作,而在decStrong()函数中调用android_atomic_dec()函数减1操作,如果引用计数值mCount为1,当减1后,值就是0,于是就delete这个对象。这里要说明的是,android_atomic_inc()函数和android_atomic_dec()函数都是原子操作。

而关于lp的使用,它要和强指针(sp)配合起来一块用,比如:

此处首先定义一个子类XXXClass,继承LightRefBase模板类。在XXXClass的main()函数里,首先new一个XXXClass对象,然后把这个对象赋值给智能指针lpointer,这时候引用计数值就为1,接着在main()函数里做一些工作。当main()函数做完工作之后,退出main()函数的时候,lpointer会被析构,而析构的时候,引用计数值减1之后就为0,于是,它会被delete。下面重点来看看sp,因为sp最常见。

本文内容由小琪整理编辑!