sp指针
2016-01-26 14:33
267 查看
一个目标对象,可能被n个sp强指针指向,那么就存在n个class sp对象,同时每一个sp
对象在目标对象的虚基类对象的成员类mRefs的私有二级指针成员mWeakRefs登记了一个
ref_entry结构体,这些ref_entry结构体的地址都是由该链表管理,每一个
ref_entry结构体和哪一个sp对象对应,也由该链表管理。同时链接数就是该链表节点的
个数
1. weakref_impl对象会随着目标对象的生成而产生,但不一定会随着目标对象的释放而释放。例如:如果目标对象被
1个sp引用,但是同时被2个wp引用,那么在sp被删除的时候,删除了目标对象,但没有删除weakref_impl对象,
只有在最后一个wp释放时,weakref_impl对象会被释放。
2. 一个目标对象被多个sp指针引用,没有wp引用的情况下。释放这些sp的时候,delete会调用sp析构函数,
然后调用RefBase类的成员函数decStrong(), 最后一个sp被释放时,weakref_impl对象数据成员mStrong会
从1减到0(注意mStrong的初始化值为1<<28, 从这个值可以判断出该目标对象有没有被sp指针引用过),
同时释放目标对象。
3. 一个目标对象被多个wp指针引用,没有sp引用的情况下。delete这些wp的时候,会调用wp的析构函数,该函数会
调用函数decWeak()。当删除最后一个wp的时候,代码中只是删除了目标对象,而没有释放weakref_impl对象,
暂时没发现在哪里释放了它。
4. 一个目标对象既有sp,又有wp来引用。如果sp先被删除光,那么最后一个sp删除的时候会释放掉目标对象,那么此时
mStrong = 0。在后续最后一个wp的释放过程中,在decWeak()函数中就会判断出impl->mStrong !=
INITIAL_STRONG_VALUE,而释放掉剩下的weakref_impl对象了。如果先所以的wp删除光,此时mWeak还等于剩余的sp
的个数,所以此时的释放情况,同第2小点的说明。
5. 从wp定义来看,wp是不能直接操作对象的,必须先升级为sp才行。这个升级的过程是依靠函数promote()来完成的。
升级成功,返回新生成的sp对象指针,升级失败,返回NULL。需要注意的是,如果目标对象之前有过sp指向,但后来
将所有的sp释放完之后,此时目标对象是不存在的,那么此时用户还想将指向该目标对象的wp升级为sp的话,
此时就返回NULL。那么这个时候我们应该delete这些剩下的wp。
对象在目标对象的虚基类对象的成员类mRefs的私有二级指针成员mWeakRefs登记了一个
ref_entry结构体,这些ref_entry结构体的地址都是由该链表管理,每一个
ref_entry结构体和哪一个sp对象对应,也由该链表管理。同时链接数就是该链表节点的
个数
1. weakref_impl对象会随着目标对象的生成而产生,但不一定会随着目标对象的释放而释放。例如:如果目标对象被
1个sp引用,但是同时被2个wp引用,那么在sp被删除的时候,删除了目标对象,但没有删除weakref_impl对象,
只有在最后一个wp释放时,weakref_impl对象会被释放。
2. 一个目标对象被多个sp指针引用,没有wp引用的情况下。释放这些sp的时候,delete会调用sp析构函数,
然后调用RefBase类的成员函数decStrong(), 最后一个sp被释放时,weakref_impl对象数据成员mStrong会
从1减到0(注意mStrong的初始化值为1<<28, 从这个值可以判断出该目标对象有没有被sp指针引用过),
同时释放目标对象。
3. 一个目标对象被多个wp指针引用,没有sp引用的情况下。delete这些wp的时候,会调用wp的析构函数,该函数会
调用函数decWeak()。当删除最后一个wp的时候,代码中只是删除了目标对象,而没有释放weakref_impl对象,
暂时没发现在哪里释放了它。
4. 一个目标对象既有sp,又有wp来引用。如果sp先被删除光,那么最后一个sp删除的时候会释放掉目标对象,那么此时
mStrong = 0。在后续最后一个wp的释放过程中,在decWeak()函数中就会判断出impl->mStrong !=
INITIAL_STRONG_VALUE,而释放掉剩下的weakref_impl对象了。如果先所以的wp删除光,此时mWeak还等于剩余的sp
的个数,所以此时的释放情况,同第2小点的说明。
5. 从wp定义来看,wp是不能直接操作对象的,必须先升级为sp才行。这个升级的过程是依靠函数promote()来完成的。
升级成功,返回新生成的sp对象指针,升级失败,返回NULL。需要注意的是,如果目标对象之前有过sp指向,但后来
将所有的sp释放完之后,此时目标对象是不存在的,那么此时用户还想将指向该目标对象的wp升级为sp的话,
此时就返回NULL。那么这个时候我们应该delete这些剩下的wp。
相关文章推荐
- mac cocoa中注册全局快捷键
- AutoLayout
- Qual F&Q
- 【JS对象、JSON字符串】之间的相互转换
- swift 异步加载图片(第三方框架ImageLoader)
- CI框架 -- 核心文件 之 Input.php(输入数据处理文件)
- 【Boost】boost库中thread多线程详解11——线程的休眠和中断
- 使用 Environment Indicator 模块区分不同的 Drupal 环境
- YTU 2851: 数字游戏
- KMP算法
- Java序列化Serializable解析
- 如何在jsp中调用service层的方法
- 使用LocalBroadcastManager
- 看的一些有用常用的东西,收藏一下
- 一种动态开辟二维数组的办法
- Generative Modeling of Convolutional Neural Networks
- Linux下安卓ndk混合编译调用so方法——QuickStart学习
- ACAccountCredential
- MPICH2 bcast广播函数使用
- error LNK2001: 无法解析的外部符号 "__declspec(dllimport) void __cdecl google::InstallFailureSignalHandle