wp对象调用promote方法返回sp对象,如果sp指向的对象
已经销毁,promote返回NULL
template<typename T>
sp<T> wp<T>::promote() const
{
sp<T> result;
if (m_ptr && m_refs->attemptIncStrong(&result)) {
result.set_pointer(m_ptr);
}
return result;
}
可以将wp提升为sp的三种情况:
1、 没有sp指向目标对象且mStrong == INITIAL_STRONG_VALUE
2、 没有sp指向目标对象且mStrong == 0 且mFlags == OBJECT_LIFETIME_WEAK
3、有sp指向目标对象
attemptIncStrong()代码说明了上面的三种情况
bool RefBase::weakref_type::attemptIncStrong(const void* id)
{
incWeak(id);
weakref_impl* const impl = static_cast<weakref_impl*>(this);
int32_t curCount = impl->mStrong;
LOG_ASSERT(curCount >= 0, "attemptIncStrong called on %p after underflow",
this);
while (curCount > 0 && curCount != INITIAL_STRONG_VALUE) {
if (android_atomic_cmpxchg(curCount, curCount+1, &impl->mStrong) == 0) {
break;
}
curCount = impl->mStrong;
}
if (curCount <= 0 || curCount == INITIAL_STRONG_VALUE) {
bool allow;
if (curCount == INITIAL_STRONG_VALUE) {
// Attempting to acquire first strong reference... this is allowed
// if the object does NOT have a longer lifetime (meaning the
// implementation doesn't need to see this), or if the implementation
// allows it to happen.
allow = (impl->mFlags&OBJECT_LIFETIME_WEAK) != OBJECT_LIFETIME_WEAK
|| impl->mBase->onIncStrongAttempted(FIRST_INC_STRONG, id);
} else {
// Attempting to revive the object... this is allowed
// if the object DOES have a longer lifetime (so we can safely
// call the object with only a weak ref) and the implementation
// allows it to happen.
allow = (impl->mFlags&OBJECT_LIFETIME_WEAK) == OBJECT_LIFETIME_WEAK
&& impl->mBase->onIncStrongAttempted(FIRST_INC_STRONG, id);
}
if (!allow) {
decWeak(id);
return false;
}
curCount = android_atomic_inc(&impl->mStrong);
…
}
}
impl->addStrongRef(id);
…
return true;
}
分享到:
相关推荐
在Android的Native层开发中,为了管理和防止内存泄漏,Google引入了一套基于C++的智能指针系统,主要包含两个关键类型:sp(Strong Pointer)和wp(Weak Pointer)。它们都是基于类RefBase的引用计数机制来实现的,...
智能指针sp和wp在android c++源码中使用非常频繁,例如IBinder机制,但是它比c++中普通的智能指针要复杂很多,相信不少android学习者如果c++基础不是很扎实的,看起来会比较吃力和枯燥。本人在android 4.2.2源码基础...
总之,`Android sp&wp 测试代码`项目旨在帮助开发者理解SharedPreferences和WakeLock的底层实现,通过C语言的角度揭示Android系统的一部分工作原理。通过学习和实践,可以加深对Android系统如何管理数据存储和电源...
在Android中,`sp`和`wp`是C++智能指针的缩写,`sp`代表`std::shared_ptr`,`wp`代表`std::weak_ptr`,它们是C++11标准库中的智能指针类型。`std::shared_ptr`是强引用,而`std::weak_ptr`是弱引用。 3. **std::...
在Android系统中,智能指针是用来管理对象生命周期的重要工具,主要分为`sp`(strong pointer)和`wp`(weak pointer)两种类型。它们都是基于C++的引用计数机制,用于自动管理内存,防止内存泄漏。在Android框架层,...
在Android系统中,`sp`和`wp`的配合使用可以有效地管理C++对象,避免内存泄漏,同时保证了内存的高效利用。这种机制使得开发者无需手动管理内存,减少了出错的可能性,提高了代码的可维护性和安全性。理解并熟练掌握...
`sp<T>`用于持有对象并自动管理其生命周期,而`wp<T>`则允许在对象可能已经被删除的情况下保持引用。 `IBinder`是Binder接口的核心抽象类,它继承自`RefBase`并声明了一系列虚函数。这些函数包括`...
总之,Android框架层的学习是一个综合性的过程,涉及C++基础、设计模式、系统架构等多个方面。通过逐步深入,你将能够掌握Android系统的核心,从而在开发中游刃有余。记住,持续实践和探索是深化理解的关键。
- **sp、wp、RefBase、Thread等类**:第五章介绍了Android系统中常用的类如sp、wp、RefBase、Thread等,以及同步类、Handler和Looper机制,这些都是理解和开发Android应用的基础。 #### 6. Binder机制全面解析 - **...
- **wp**: 与sp类似,但是它是弱指针,主要用于解决循环引用的问题。 ##### IBinder.h与Binder.cpp - **IBinder**: 这是一个非常重要的低层类,所有的Binder类型都继承自它。它是一个抽象类,包含了一些关键的方法...
对于Android应用开发工程师而言,本书中关于Binder,以及sp、wp、Handler和Looper等常用类的分析或许能帮助你迅速适应Android平台上的开发工作。 (2)Android系统开发工程师 Android系统开发工程师常常需要...
4. 弱引用与强引用转换:弱指针`wp_obj`需要通过`promote()`方法升级为强指针`sp_obj`才能访问对象。例如: ```cpp wp<MyClass> wp_obj = new MyClass(); sp<MyClass> sp_obj = wp_obj.promote(); ``` 5. 效率...
当需要操作对象时,可以将wp转换为sp,如果对象已经被销毁,则wp的promote()方法会返回空指针。这种方式有助于避免无效指针的访问,保证了程序的稳定运行。 智能指针的使用方法也很关键,类需要继承自RefBase,并且...
在Android源代码中,经常会看到形如`sp<xxx>`、`wp<xxx>`这样的类型定义,这其实是Android中的智能指针。 智能指针有两种类型:强指针(strong pointer)和弱指针(weak pointer)。强指针通过引用计数来记录有多少...
- **RefBase、sp和wp**:RefBase是Android中用于引用计数管理的基础类,sp和wp是智能指针,分别代表强引用和弱引用,用于管理对象生命周期,防止内存泄漏。 **Binder重难点分析** - **Binder时空穿越魔术揭秘**:...