最近项目测试然后发现有很多闪退的情况,用工具去检测了下确定是程序代码导致内存泄露的,然后就去找了发现了代码中存在下图中所示的写法(这只是个例子并不是实际情况)
开始的时候想当然了,认为按照引用计数这种原理,People这个对象创建之后,如果不手动把Hand中People对象置为NULL,然后再把People这个对象置为NULL是无法释放掉的,但是在我把这两个对象都置为null之后还是没有得到释放。我比较怀疑C#的GC机制和引用计数是一个东西?,然后就去查了下资料,这里附上云风的博客链接https://blog.codingnow.com/2008/06/gc.html,里面对比了GC和引用计数的区别。我简单介绍下。
GC与引用计数的区别:
GC在触发的时候会去遍历所有的对象,把所有的引用构成一张有向图,对于那些已经超出作用域死亡了的对象会打上清除标记,那些还在作用域内或者被其他对象引用的对象则不会打上标记。而对于互相引用的这种特殊情况,如果他们都已经不在作用域内且没有另外的外部变量引用,GC会把他们打上清除标记。但是引用计数并不是这样,引用计数会