都说C++的很容易内存泄漏,所以有了GC。有了GC,爸妈再也不用担心我的学习(J)。但是使用GC也有几个大陷阱要注意。
第一个是资源被一直引用。当然都是无意中造成(谁会存心这么做?拉出去突突了)。
常见的就是event的handler;有用+=,但是忘了-=。如果handler中有大量资源,而且不再被使用了,也会造成内存“泄露”。
还有就是一些static的引用,它们的生命周期一直到app推出;被他们引用的resource,不论会不会再次使用,都不会被释放。
第二个是weak reference。
因为担心上面的问题,比如,一些static的引用, 变成了weakreference。
Weak references are useful for objects that use a lot of memory, but can be recreated easily if they are reclaimed by garbage collection.
这样一来,新的问题又来了(怎么没有完美无暇的方案呢?有没有银弹?)。有些你想用的object,(可能迟了点),GC先reach了就会被释放。
可以看看下面的链接,一个不错的例子。
http://stackoverflow.com/questions/2281566/is-josh-smiths-implementation-of-the-relaycommand-flawed
如果使用GC不当,C++其中的两大经典问题(memory leak, invalid memoryaccess)还是会不时来骚扰你!
所以GC虽好,也不要乱用哦!
Weak Event Patterns - http://msdn.microsoft.com/en-us/library/aa970850.aspx