测试了一下 vim 的 libcall()

Vim、Emacs配置和使用
回复
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

测试了一下 vim 的 libcall()

#1

帖子 自由建客 » 2011-06-01 23:15

手册中没说明白,返回的内存块如何处理,简单的测试了一下,很明显,vim 不作为。

代码: 全选

#define SIZE 1024*1024*100

char *test(char *a)
{
    int i;
    char *r=(char *)malloc(SIZE);
    for(i=0; i<SIZE; ++i)
        r[i]='A';
    return r;
}

代码: 全选

fun! Test()
	let i=0
	while i<1024
		redraw
		call libcall("/home/fb/work/vimide/test.so", "test", "")
		!free -m | grep '^-'
		sleep 1
		let i+=1
	endwhile
endfun
可发现内存不断消耗,很快就会提示
“无法 fork”
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: 测试了一下 vim 的 libcall()

#2

帖子 fanhe » 2011-06-02 14:22

你试过 garbagecollect() 了没
这么短时间我估计来不及自运行垃圾回收

而且, 本来用 libcall 就是一个非常蛋疼的选择!
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: 测试了一下 vim 的 libcall()

#3

帖子 自由建客 » 2011-06-02 22:15

garbagecollect() 只会释放 vim 自己申请的内存,贸然释放别人申请的太危险了,况且诸如 libc 中的 getenv 返回的非堆地址根本不可释放,所以 vim 干脆不作为。
只可惜它没有提供个选择,比如 libcallandfree() 。
回复