发现巨匠对写库很热衷。不外,写一个库,用C++最麻烦的工作,就是你new完了要记着delete。不外,这么傻瓜化的操作,有没有法子让电脑自动完成呢?当然是可以的。思绪有以下三点: / h" M) ~$ w3 Q& K- T* [6 S F
1、Parent对象。 $ E/ q/ L6 n1 @0 F- A
每一个对象,都要有独一的parent,当parent析构时,要带动他所有的children析构。 6 N/ f2 B3 s7 q" u/ b0 R
益处:
5 v# c9 T5 i3 { S5 o C) n 实现简单,且具有逻辑性。
! Y5 k* C6 e6 y+ L 好比:一个窗口,他的按键,就应该是这个窗口的children,当窗口析构的时辰,按键也必需析构。 $ x9 T2 N8 ]2 c
坏处:
4 T9 ?9 \# p7 n% q' x7 s 不成以有复制机关函数……
" v6 [; F7 v0 y' g# h 这个也很好理解。A-->B-->C中,a是b的parent,b是c的parent,如不美观许可复制,B复制了个D,那C就有两个parent,事实怎么析构呢?
: B+ X3 r; j1 K. c7 e6 M 开源库的实现:
) \; Q9 Z$ G0 l4 C' Z( b( g Qt实现了这种体例的内存打点,尤其是对GUI框架,十分合用。
2 e3 f+ W' c+ R/ \. K 2、引用计数的SharedPtr
. [* n) @5 J. J- F 指针,进行复制操作的时辰,引用计数+1,析构的时辰引用计数-1,当引用计数为0的时辰,释放空间。 * @( P1 n/ q& d0 k2 u z
益处:
, C1 X" ^1 {: v: z 实现简单 % w$ d& z, H4 E* N9 [* z
坏处: + V0 z' ]6 @8 i% S! }
具有轮回引用的情形。要惹人WeakPtr
7 D: m# e8 t3 D+ S4 f5 ~ 开源库的实现:
( f/ U; m! [, A$ f; |9 W* C0 R* r+ |# p Qt同时实现了这种手艺,Boost也有相关实现。 , y$ ^: ^- b$ q; O+ @' k
我因为比来想自己实现一套Signalandslot库,也实现了SharedPtr,开源。
/ R& k9 i4 L- ?0 H3 ` 地址:http://gitorious.org/raylib/raylib/blobs/master/SmartPtr.hpp
* w7 N4 J8 N' B- ?' v 评述: 2 E( ]9 a# D: g, N
这是C++中最通用的实现手段,如不美观你要做一套类库,考试考试使用SharedPtr,会让工作变得加倍简单。 3 I0 y- i! L' K- U8 [& y
3、重载new,实现GC $ s0 V H+ \3 R, [% v
直接重载C++操作符,实现垃圾收受接管。初始化一个内存池,当内存池满的时辰,进行垃圾收受接管操作。
; ]7 j z/ O8 J 益处: 3 b* t$ W$ {9 p9 _+ V7 P$ ~2 D
一劳永逸 - x9 N, V* O2 t/ x O0 w; z6 N2 v
坏处: 8 M5 H. q x0 a# V1 V! g; c
实现坚苦。
/ F7 m) @, s/ J0 x3 G 占用内存大。 , U/ T' T+ E, M& C! D7 R
对已有的情形,不必然会有很好的撑持。 - I) T- ~: _5 n, \: z
开源库的实现: % K$ _0 I' k; d9 X0 v. g: N
python和java都有垃圾收受接管的实现,可以进行参考。
- N6 Y/ v/ J" R) L7 C/ y 评述: 内存池也许不必然要做垃圾收受接管,如不美观是静态的内存池,可以加速内存分配的过程。 |