android 中c++很多使用弱指针的地方?什么时候使用,有什么好处?


如果是为了防止内存泄露等问题的话,实用强指针也一样,为啥还有弱指针

Android C++

fromst 12 years, 1 month ago

我关注过rc的循环引用问题,简单说下:
参看这个问题: @如何检测或者解决循环引用计数的问题(简单而行之有效的方法)?

android的gc是采用的rc的方式,智能指针也是基于rc实现的,而简单的rc技术无法解决循环引用引出的问题,例如a对象引用b对象,b对象同时引用a对象,gc在进行内存释放的时候会出现问题,因为系统一次只能释放一个对象,无论是决定回收a还是回收b的存储,都会发现他们被别的对象引用,造成存储无法释放,也正是因为没有一种编译期很好的检测循环引用的机制,所以引入弱了引用。

当a对象引用b对象时,a对b持有强引用,而如果b要引用a对象时,b就需要持有一个弱引用。当gc的时候,只要发现强引用为0就可以进行回收,不需要关心弱引用计数。但是如果只是对一个对象持有弱引用,就不能直接受用,需要将其升级为强引用才可以使用这个对象,在转换为强引用的过程中,如果对象已经不存在则转换失败,说明对象已经被销毁。

1:当发现存在循环引用的时候,需要使用弱引用来解除循环引用的问题。
2:当创建占据存储较大的对象时,在某些地方只是为了访问对象的一些基本信息,也可以考虑使用弱引用,这样gc可以在必要的时候进行回收,节省存储。

以下两条来自 Avoiding Memory Leaks

3:Do not keep long-lived references to a context-activity (a reference to an activity should have the same life cycle as the activity itself)
4:Avoid non-static inner classes in an activity if you don't control their life cycle, use a static inner class and make a weak reference to the activity inside. The solution to this issue is to use a static inner class with a WeakReference to the outer class, as done in ViewRoot and its W inner class for instance

Keines answered 12 years, 1 month ago

Your Answer