Coreseek®  
 | 首页 | 注册 | 回复 | 搜索 | 统计资料 |                 网站首页产品服务开放源码安装使用常见问题中文手册社区交流联系我们 
中文分词 论坛首页 / 中文分词 /

大家没发现mmseg漏内存么?

 
DreamDreams
会员
#1 | 发表时间: 2010 05 12 16:16 | 修改: DreamDreams
回复 
我用valgrind跑了一下,发现n多地方内存释放有问题。
我改了几处,不过肯定没改全,算抛砖引玉吧。


colordiff -r mmseg-3.2.12.orig/src/ mmseg-3.2.12/src

diff  -r mmseg-3.2.12.orig/src/css/SynonymsDict.h mmseg-3.2.12/src/css/SynonymsDict.h
59a60
>               printf ("called destructor\n");
61a63
>                        printf ("did it \n");
diff  -r mmseg-3.2.12.orig/src/css/ThesaurusDict.h mmseg-3.2.12/src/css/ThesaurusDict.h
5a6,9
> #include "darts.h"
> #include "csr.h"
> #include "csr_mmap.h"
>
14,17d17
< #include "darts.h"
< #include "csr.h"
< #include "csr_mmap.h"
<

diff -r mmseg-3.2.12.orig/src/mmseg_main.cpp mmseg-3.2.12/src/mmseg_main.cpp
230c230
<       std::istream *is;
---
>       std::ifstream *is;
307a308
>       is->close();
308a310
>       delete[] buffer;
diff -r mmseg-3.2.12.orig/src/utils/csr_mmap.c mmseg-3.2.12/src/utils/csr_mmap.c
89a90
>       {
90a92
>               free( mm );
91a94
>       }
98a102
>               free( mm );
106a111
>               free( mm );
114a120,121
>       {
>               free( mm );
116a124
>       }
117a126,127
>       {
>               free( mm );
119a130
>       }
123a135
>               free( mm );
129a142,143
>       {
>               free( mm );
130a145
>       }
HonestQiao
会员
#2 | 发表时间: 2010 05 13 16:05
回复 
感谢提供
nzinfo
会员
#3 | 发表时间: 2010 05 13 16:20
回复 
不好意思,我完全看不懂你的diff格式,可以用 -uNr 格式吗?
mmseg_main.cpp 可能有泄漏,但是不影响,因为是一次性执行的程序
csr_mmap.c  确实存泄漏的可能性,是疏忽了。但是非常有限,在极端的情况下才可能发生(此时,操作系统也往往不能正常工作了)。
DreamDreams
会员
#4 | 发表时间: 2010 05 13 16:47
回复 
别看我的diff了,意义不大,下面是valgrind的输出,看这个完全就可以了。
读config文件有好几处泄漏。
另外一次性泄漏也是泄漏,不能大意。
这里是一次性,但如果有人想移植到别的地方(比如我就想把recoll原来的ngram替换掉)可就不一定是一次性了。

==6467== 24 bytes in 2 blocks are definitely lost in loss record 1 of 7
==6467==    at 0x4023D6E: malloc (vg_replace_malloc.c:207)
==6467==    by 0x8057A24: mmap_file (csr_mmap.c:58)
==6467==    by 0x804D1CD: css::SynonymsDict::load(char const*) (SynonymsDict.cpp:46)
==6467==    by 0x804B765: css::SegmenterManager::init(char const*, unsigned char) (SegmenterManager.cpp:164)
==6467==    by 0x804AEAA: main (mmseg_main.cpp:212)
==6467==
==6467==
==6467== 1,677 (20 direct, 1,657 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 7
==6467==    at 0x4021E22: calloc (vg_replace_malloc.c:397)
==6467==    by 0x805D27A: dictionary_new (dictionary.c:129)
==6467==    by 0x8058D76: iniparser_load (iniparser.c:554)
==6467==    by 0x804B46C: css::SegmenterManager::loadconfig(char const*) (SegmenterManager.cpp:72)
==6467==    by 0x804B807: css::SegmenterManager::init(char const*, unsigned char) (SegmenterManager.cpp:180)
==6467==    by 0x804AEAA: main (mmseg_main.cpp:212)
==6467==
==6467==
==6467== 121 bytes in 9 blocks are indirectly lost in loss record 3 of 7
==6467==    at 0x4023D6E: malloc (vg_replace_malloc.c:207)
==6467==    by 0x805D574: xstrdup (dictionary.c:71)
==6467==    by 0x805D6F4: dictionary_set (dictionary.c:276)
==6467==    by 0x8059236: iniparser_load (iniparser.c:599)
==6467==    by 0x804B46C: css::SegmenterManager::loadconfig(char const*) (SegmenterManager.cpp:72)
==6467==    by 0x804B807: css::SegmenterManager::init(char const*, unsigned char) (SegmenterManager.cpp:180)
==6467==    by 0x804AEAA: main (mmseg_main.cpp:212)
==6467==
==6467==
==6467== 171 bytes in 1 blocks are definitely lost in loss record 4 of 7
==6467==    at 0x402309E: operator new[](unsigned) (vg_replace_malloc.c:268)
==6467==    by 0x804A554: segment(char const*, css::Segmenter*) (mmseg_main.cpp:246)
==6467==    by 0x804AF10: main (mmseg_main.cpp:220)
==6467==
==6467==
==6467== 512 bytes in 1 blocks are indirectly lost in loss record 5 of 7
==6467==    at 0x4021E22: calloc (vg_replace_malloc.c:397)
==6467==    by 0x805D2B9: dictionary_new (dictionary.c:135)
==6467==    by 0x8058D76: iniparser_load (iniparser.c:554)
==6467==    by 0x804B46C: css::SegmenterManager::loadconfig(char const*) (SegmenterManager.cpp:72)
==6467==    by 0x804B807: css::SegmenterManager::init(char const*, unsigned char) (SegmenterManager.cpp:180)
==6467==    by 0x804AEAA: main (mmseg_main.cpp:212)
==6467==
==6467==
==6467== 512 bytes in 1 blocks are indirectly lost in loss record 6 of 7
==6467==    at 0x4021E22: calloc (vg_replace_malloc.c:397)
==6467==    by 0x805D2A6: dictionary_new (dictionary.c:134)
==6467==    by 0x8058D76: iniparser_load (iniparser.c:554)
==6467==    by 0x804B46C: css::SegmenterManager::loadconfig(char const*) (SegmenterManager.cpp:72)
==6467==    by 0x804B807: css::SegmenterManager::init(char const*, unsigned char) (SegmenterManager.cpp:180)
==6467==    by 0x804AEAA: main (mmseg_main.cpp:212)
==6467==
==6467==
==6467== 512 bytes in 1 blocks are indirectly lost in loss record 7 of 7
==6467==    at 0x4021E22: calloc (vg_replace_malloc.c:397)
==6467==    by 0x805D293: dictionary_new (dictionary.c:133)
==6467==    by 0x8058D76: iniparser_load (iniparser.c:554)
==6467==    by 0x804B46C: css::SegmenterManager::loadconfig(char const*) (SegmenterManager.cpp:72)
==6467==    by 0x804B807: css::SegmenterManager::init(char const*, unsigned char) (SegmenterManager.cpp:180)
==6467==    by 0x804AEAA: main (mmseg_main.cpp:212)
==6467==
==6467== LEAK SUMMARY:
==6467==    definitely lost: 215 bytes in 4 blocks.
==6467==    indirectly lost: 1,657 bytes in 12 blocks.
==6467==      possibly lost: 0 bytes in 0 blocks.
==6467==    still reachable: 0 bytes in 0 blocks.
==6467==         suppressed: 0 bytes in 0 blocks.
DreamDreams
会员
#5 | 发表时间: 2010 05 13 16:48
回复 
另外src/css/ThesaurusDict.h文件里的#include应该在namespace外面,否则gcc 4.3编译报错。
linzhoulxyz
会员
#6 | 发表时间: 2010 05 14 09:27
回复 
都是高人。。。
nzinfo
会员
#7 | 发表时间: 2010 05 14 15:09
回复 
sss
nzinfo
会员
#8 | 发表时间: 2010 05 14 15:10
回复 
@DreamDreams: 有兴趣加入我们马?我们的联系方式网站上有。
DreamDreams
会员
#9 | 发表时间: 2010 05 14 15:20
回复 
生计所迫,没多少时间,而且我对C++是一窍不通,对搜索也不懂,呵呵。
fsdi0254
会员
#10 | 发表时间: 2010 10 25 17:49
回复 
...
 
回复
Bold Style  Italic Style  Image 链接  URL 链接 
发帖注意:
  • 网址中请去掉http://开头,例如:您需要输入www.coreseek.cn,而不是http://www.coreseek.cn
  • 咨询问题,请贴出详细的操作系统版本、Coreseek版本(Linux环境请给出编译参数)
  • 请仔细查看中文手册和本站安装指南,确认操作正确
  • 请仔细查看常见问题解答,也许你的问题已经有解决方法

» 帐号  » 密码 
发帖前请登陆, 或者 注册 .