a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 108|回复: 1

[程序员] 2012年软件水平考试程序员辅导笔记之C++内存泄漏的解决办法

[复制链接]
发表于 2012-8-2 08:51:15 | 显示全部楼层 |阅读模式
发现大家对写库很热衷。不过,写一个库,用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
回复

使用道具 举报

 楼主| 发表于 2012-8-2 08:51:16 | 显示全部楼层

2012年软件水平考试程序员辅导笔记之C++内存泄漏的解决办法

  开源库的实现:
* Y/ D) D1 x+ P+ m2 _+ f  Qt同时实现了这种技术,Boost也有相关实现。
# m7 H- w( `8 G9 \& X$ ^2 u5 z& [  我因为最近想自己实现一套Signalandslot库,也实现了SharedPtr,开源。 & D$ `3 a7 W5 ^) r- A$ K) P
  地址:http://gitorious.org/raylib/raylib/blobs/master/SmartPtr.hpp " \" e; R) X8 o$ q9 y
  评述: 5 L7 K, U9 @* r5 R, y  B
  这是C++中最通用的实现手段,如果你要做一套类库,尝试使用SharedPtr,会让事情变得更加简单。 % |6 R# ^0 s, H+ o
  3、重载new,实现GC 8 k$ I) p2 T# `/ z; W
  直接重载C++操作符,实现垃圾回收。初始化一个内存池,当内存池满的时候,进行垃圾回收操作。 " c4 |* H2 a1 x
  好处:
" j9 |! M1 C5 V  一劳永逸
7 G) ^$ F) y6 u3 @  坏处: + c# ?1 N5 t; p# o7 W
  实现困难。 - y/ E, \; u- E8 g
  占用内存大。 6 R: ~0 J; W+ V$ |
  对已有的环境,不一定会有很好的支持。
. Y8 T! \, R! b+ D( }* H; d" q  开源库的实现: / y  h8 D$ b7 L2 {
  python和java都有垃圾回收的实现,可以进行参考。 7 i) g- n. [" v+ F+ z
  评述:   内存池也许不一定要做垃圾回收,如果是静态的内存池,可以加速内存分配的过程。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 11:13 , Processed in 0.173108 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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