2016-5-25 初稿

  1. 解决什么样的问题?
    什么时候释放对象。

    对象不同于一般的变量,生存周期受其作用域的影响。比如在函数内声明的变量,在函数之外就没有了作用。对象的生存周期是受其引用对象的影响。

    引用的实质是使用指向其内存的指针。

    当我们实例化对象时,也就为其分配了相应的内存,再通过指向对象的指针访问这些内存。释放就是把指向对应内存的指针给消除。而其实,对应内存的内容是没有去改变的。直到该内存下一次被使用时,其内容才会被改变。

    什么是内存?计算机内存,是数据存储的地方。计算机存储存在着一种层次结构,如同三角型。因为越快的越贵,越大的越便宜,越大的也越慢。每一个内存都有其对应的地址。如果你学过操作系统,还应该知道,因为虚拟机的原因,程序使用的是虚拟内存,需要进行转换之后,得到实际的物理内存。

    什么是指针?指针存储对象所在的内存地址。比如,寻宝图,你到达A地之后,A地会有指向B地的对应消息。这个消息就是指针。

  2. 什么是引用计数?

    引用计数,是当一个对象A使用另一对象B时,对象B的引用数会加一。当对象B没有引用之后,便会释放。

  3. 什么是自动引用计数?

    自动引用计数,即当对象被引用之后,会自动对其引用数加一;解除引用之后,会自动减一;没有引用之后,会自动释放。

  4. 为什么需要自动引用计数? 方便内存管理。
  5. 什么时候不能使用? 对于一些底层的类。

  6. 存在着什么样的弊端? 循环引用。 循环引用,当A对象持有(引用)B对象,B对象持有A对象,此时彼此都在等待对方,导致内存无法释放。

    如何解决?狭路相逢,要么有人仲裁,要么一方示弱。你可以手动解决,或者只将其中一方声明为weak引用。

    你可以通过定义类之间的关系为弱引用(weak)或者无主引用(unwoned),以此替代强引用,从而解决循环强引用的问题。

  7. 其他语言中是如何做的呢? Java中采用的是垃圾回收机制(Garbage Collection, GC)。垃圾回收机制的基本原理是建立一棵树。

GC也有不好的地方,对于实时的应用程序效果就不理想,因为你不知道CG会在什么时候发生。影响系统性能。

“Garbage collection does have its own problems. Languages like Java and Ruby aren’t as suited to real-time applications where timing is critical. In these languages you never know when garbage collection will occur. Of course there is research into these problems to solve this issue for real-time systems but in general C++ is probably a better choice for real-time applications. ” ——《Programming Language》

看编译原理第七章运行时环境,很多东西都讲了的。

突然意识到,很多博客,不过是书籍的个人阐述,不如自己读书。