Hightman 论坛

完整版: 为什么程序消耗的内存越来越大
您当前正在浏览的是一个简化版本. 要观看完整版本, 请点这儿.
#include <scws.h>
#include <stdlib.h>
int main()
{
scws_t s;
scws_res_t res, cur;
char *text = "Hello, 我名字叫李那曲是一个中国人, 我有时买Q币来玩, 我还听说过C#语言";

int i;
if (!(s = scws_new())) {
printf("error, can't init the scws_t!\n");
exit(-1);
}
scws_set_charset(s, "gbk");
scws_set_dict(s, "/usr/local/scws/etc/dict.xdb", SCWS_XDICT_XDB);
scws_set_rule(s, "/usr/local/scws/etc/rules.ini");

for(i = 0; i < 1000000; i++){
scws_send_text(s, text, strlen(text));
while (res = cur = scws_get_result(s))
{
while (cur != NULL)
{
printf("Word: %.*s/%s (IDF = %4.2f)\n",
cur->len, text+cur->off, cur->attr, cur->idf);
cur = cur->next;
}
scws_free_result(res);
}
}
scws_free(s);
return 0;
}
//上面的程序消耗的内存越来越大,不解
是什么版本呢,新的版本应该是没有内存泄露了。

越来越大你的监控方式是什么呢?最好能给出较为准确的数据以便判断。
版本:scws-1.1.0
监控方式:在linux下使用top指令


(2010-03-04 04:48 PM)hightman 提到: [ -> ]是什么版本呢,新的版本应该是没有内存泄露了。

越来越大你的监控方式是什么呢?最好能给出较为准确的数据以便判断。

其实代码只是在文档的例子中添加了一个循环。

(2010-03-04 04:48 PM)hightman 提到: [ -> ]是什么版本呢,新的版本应该是没有内存泄露了。

越来越大你的监控方式是什么呢?最好能给出较为准确的数据以便判断。
非常感谢您的汇报,经仔细跟踪已经发现bug所在,稍后会发布1.1.1版本。

bug位地 xdict.h 中的(这是1.1.0起新加的功能,所以1.0.x的版本无此bug)
#define SCWS_WORD_MALLOCED 0x100
只要将 0x100 改变 0x80 即可,因为 struct scws_word 中定义的 flag 为 unsigned char 即 8bit, 容不下 0x100 导致,所有的 ->flag |= SCWS_WORD_MALLOCED 失效,以至于在 scws.c 中无法正确的释放这些内存。

再次感谢您的汇报!对于长期运行的程序来说这造成的内存泄漏非常严重。
Reference URL's