You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
2.0 KiB
39 lines
2.0 KiB
5 years ago
|
---
|
||
|
智能指针
|
||
|
---
|
||
|
|
||
|
#### 前言
|
||
|
|
||
|
智能指针是一种能够自动维护对象引用计数的技术,它是一个对象而不是一个指针,但是它引用了一个实际使用的对象。正是因为它是一个对象,因此它能够自动地维护实际对象的引用计数。简单来说,就是在智能指针构造时,增加它所引用的对象的引用计数;而在智能指针析构时,就减少它所引用的对象的引用计数。由于智能指针的构造和析构都是自动的,因此,它就很自然的实现了自动的对象引用计数技术。
|
||
|
|
||
|
但是这样并不能解决对象的相互引用问题,于是就需要采取一种稍微复杂的引用计数技术来维护对象的生周期了,这种引用计数技术将对象的引用计数分为强引用计数和弱引用计数两种,其中,对象的生命周期只受强引用计数控制。
|
||
|
|
||
|
Android 系统提供了三种类型的 C++ 智能指针,分别为轻量级指针(Light Pointer)、强指针(Strong Pointer)和弱指针(Weak Pointer)。
|
||
|
|
||
|
#### 轻量级指针
|
||
|
|
||
|
```c++
|
||
|
template <class T>
|
||
|
class LightRefBase
|
||
|
{
|
||
|
public:
|
||
|
inline LightRefBase() : mCount(0) { }
|
||
|
inline void incStrong(__attribute__((unused)) const void* id) const {
|
||
|
mCount.fetch_add(1, std::memory_order_relaxed);
|
||
|
}
|
||
|
inline void decStrong(__attribute__((unused)) const void* id) const {
|
||
|
if (mCount.fetch_sub(1, std::memory_order_release) == 1) {
|
||
|
std::atomic_thread_fence(std::memory_order_acquire);
|
||
|
delete static_cast<const T*>(this);
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
mutable std::atomic<int32_t> mCount;
|
||
|
};
|
||
|
```
|
||
|
|
||
|
LightRefBase 是一个模版类,其中,模版参数 T 表示对象的实际类型,它只有一个成员变量 mCount,用来描述一个对象的引用计数值。并提供了 incStrong 和 decStrong 来增加和减少它所引用的对象的引用计数。
|
||
|
|
||
|
轻量级指针的实现类为 sp,它同时也是强指针的实现类。在本节中,我们只关注它与轻量级指针相关的实现,它的定义如下所示:
|
||
|
|