gpt4 book ai didi

c - 如何正确释放一个 erlang 术语

转载 作者:太空狗 更新时间:2023-10-29 15:36:05 25 4
gpt4 key购买 nike

在例子中erlang port程序

tuplep = erl_decode(buf);
fnp = erl_element(1, tuplep);
argp = erl_element(2, tuplep);
...
erl_free_compound(tuplep);
erl_free_term(fnp);
erl_free_term(argp);

erl_free_compound 和 erl_free_term 都用于释放同一个 ETERM* 的任期(及其子任期)。从 erl_free_compund() 的文档中可以看出

erl_free_compound() will recursively free all of the sub-terms associated with a given Erlang term

所以,我的问题是,erl_element() 是否制作了一个元素的副本,如果不单独释放,将会泄漏内存,或者上述情况可能导致双重释放,由 erl_free_term 检测和处理。

最佳答案

erl_interface 库确实使用了一种引用计数系统来保持跟踪分配的 ETERM 结构。所以如果你写:

ETERM *t_arr[2]; 
ETERM *t1;

t_arr[0] = erl_mk_atom("hello");
t_arr[1] = erl_mk_atom("world");
t1 = erl_mk_tuple(&t_arr[0],2);

您已经创建了三 (3) 个 Erlang 术语 (ETERM)。现在如果你调用:erl_free_term(t1) 你只释放元组而不是另外两个 ETERM。要释放所有分配的内存,您必须调用:

erl_free_term(t_arr[0]); 
erl_free_term(t_arr[1]);
erl_free_term(t1)

为了避免所有这些对 erl_free_term() 的调用,你可以使用:erl_free_compund() 代替。它做了一个“深度”免费所有 ETERM 的。所以以上可以通过以下方式完成:

erl_free_compund(t1) 

因此,此例程使您可以编写以一种您不必记住的更紧凑的方式对所有子组件 ETERM 的引用。示例:

ETERM *list; 

list = erl_cons(erl_mk_int(36),
erl_cons(erl_mk_atom("tobbe"),
erl_mk_empty_list()));
... /* do some work */
erl_free_compound(list);

更新:要检查您是否真的释放了所有创建的条款,您可以使用这段代码(original manual entry:

long allocated, freed;

erl_eterm_statistics(&allocated,&freed);
printf("currently allocated blocks: %ld\n",allocated);
printf("length of freelist: %ld\n",freed);

/* really free the freelist */
erl_eterm_release();

( answer adopted from here )

关于c - 如何正确释放一个 erlang 术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17224981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com