首页 > CLucene, 程序人生 > CLucene源码剖析(四) 内存管理与调试

CLucene源码剖析(四) 内存管理与调试

内存管理,是程序设计中一个永恒的话题,如何进行内存管理,怎么来进行内存管理?通常,如果一个项目的代码中,有比较多的new/delete或者malloc/free,很多有经验的程序员都会想到用内存池(Memory Pool),来减少内存碎片的产生,提高内存的使用效率。不过今天要讨论的重点不是内存池,今天要讨论的重点是CLucene中是如何进行内存管理的,它是怎么做到方便的内存使用情况的跟踪调试的。

在CLucene中,内存管理方式有三种:
(1)Mem Leak Tacking模式,即内存泄露跟踪模式。这种模式用来跟踪内存泄露情况。
(2)Reference Count模式,即引用数统计模式。这种模块用来统计内存使用情况。
(3)缺省模式,就像我们平常地使用new/delete一样的情况。
上述三种模式都可以通过宏定义来选择具体使用哪种。

在CLucene中,它定义了一个LuceneBase的类,它为CLucene项目中所有类的基类,它里面重载了new/delete运算符,提供了可以供跟踪内存泄露,统计引用数等的功能。在所有这些特征的实现过程中,作者定义了三个全局的Set,如下所示:

defFile LuceneBase_Files(false,true); //list of filenames used
defPointer LuceneBase_Pointers(false,true); //list of pointers counted
defVoid LuceneBase_Voids(false,true); //list of arbitary data added

defFile, defPointer, defVoid都是CLSet模板类实例化后的产物, defFile用来统计在每个源码文件中内存的使用情况,defPointer用来统计每个CLucene项目内部定义的对象的使用情况, defVoid用来统计非CLucene项目中内部定义的对象数据的内存使用情况。
具体的实现细节,都在LuceneBase类的成员函数的实现中,具体可以参考memtracking.cpp(https://clucene.svn.sourceforge.net/svnroot/clucene/trunk/src/CLucene/debug/
memtracking.cpp
)中的实现。

本节内容的关键在于作者的设计思想,不在于代码的细节,因为这一节设计到的细节实现太多了,所以只能自己去一一阅读了!

  1. 2009年6月4日14:59 | #1

    悲剧。。。喜欢这个的男生很少吧。。早说我在深圳还有个比你这个大的。。

  2. 2009年6月17日03:23 | #2

    Hi! I like your srticle and I would like very much to read some more information on this issue. Will you post some more?

    • 2009年6月17日09:17 | #3

      thanks for your appreciation, i will post more about this when i
      have time~~

  3. 2009年7月7日04:38 | #4

    It’s a masterpiece. I have never thought people can have such ideas and thoughts. You are great.

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
您必须在 登录 后才能发布评论.