测试了一下 vim 的 libcall()

Vim、Emacs配置和使用
回复
头像
自由建客
论坛版主
帖子: 13442
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64
来自: freebuilder@yeah.net
送出感谢: 12 次
接收感谢: 112 次
联系:

测试了一下 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
送出感谢: 0
接收感谢: 9 次

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

#2

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

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

而且, 本来用 libcall 就是一个非常蛋疼的选择!
头像
自由建客
论坛版主
帖子: 13442
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64
来自: freebuilder@yeah.net
送出感谢: 12 次
接收感谢: 112 次
联系:

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

#3

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

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

回到 “Vim和Emacs”