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)愛爾蘭條款(ETERM)。現在如果你調用:erl_free_term(t1),你只能釋放upp元組而不是另外兩個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)
了快速查看erl_interface的來源,我還沒有完全圍繞它的頭部,但似乎涉及到引用計數,所以顯然erl_element增加了引用計數這通過以下erl_free_term調用來確保被刪除。或者錯過了什麼? – alienfromouterspace