发现大家对写库很热衷。不过,写一个库,用C++最麻烦的事情,就是你new完了要记着delete。不过,这么傻瓜化的操作,有没有办法让电脑自动完成呢?当然是可以的。思路有以下三点:
# d- z r0 ^; {( K 1、Parent对象。 - |- I$ ^7 J$ L S3 N: d3 ^( g' ]
每一个对象,都要有唯一的parent,当parent析构时,要带动他所有的children析构。
8 f/ A& r, y% Y/ S 好处:
% T$ B0 U* U& b- y 实现简单,且具有逻辑性。
+ i' L. H; m2 ^2 ]1 Z) p$ h 比如:一个窗口,他的按键,就应该是这个窗口的children,当窗口析构的时候,按键也必须析构。
% Y& H/ g' u$ \/ j3 W+ y 坏处: , @. J& p" {2 k% M
不可以有复制构造函数…… S# J9 k, p Z y" Z
这个也很好理解。A-->B-->C中,a是b的parent,b是c的parent,如果允许复制,B复制了个D,那C就有两个parent,究竟怎么析构呢? 9 a8 }1 K5 ~+ }4 G' M
开源库的实现:
, M6 l6 d; B: ^: z- k+ k Qt实现了这种方式的内存管理,尤其是对GUI框架,十分适用。
% r* F, Q* k# L, H+ G 2、引用计数的SharedPtr & y! X/ M5 x; L
指针,进行复制操作的时候,引用计数+1,析构的时候引用计数-1,当引用计数为0的时候,释放空间。 * S* k6 z) s# }& V& j8 {/ v
好处:
. K+ \1 I8 O. {4 ^" |) Q4 q 实现简单
7 _9 P3 }/ B, H, v# o 坏处: ! x m! o" b+ D8 f" Z$ P/ }$ h* m
具有循环引用的情况。要引入WeakPtr |