a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 64|回复: 0

[程序员] 2012年软件水平考试程序员知识精讲:C++内存泄漏的解决办法

[复制链接]
发表于 2012-8-2 08:51:15 | 显示全部楼层 |阅读模式
发现巨匠对写库很热衷。不外,写一个库,用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  评述:   内存池也许不必然要做垃圾收受接管,如不美观是静态的内存池,可以加速内存分配的过程。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-18 11:00 , Processed in 0.156623 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表