Я бы подумал, что если я все, что я делаю, это 1) загружаю библиотеку NIF, 2) выполняю мой новый метод / 0, 3) освобождаю все через F (), а затем 4) erlang: garbage: collect ()что я вернусь туда, откуда я начал в отношении памяти.На самом деле у меня течет память.Ясно, что мой код наиболее вероятен.
Может кто-нибудь сказать мне, что я делаю неправильно?
У меня следующая структура:
typedef struct Node
{
int Key;
ERL_NIF_TERM TermPtr;
struct Node *Next;
} Node;
Мой on-загрузка открывает ресурс
int on_load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
{
ErlNifResourceFlags flags = (ErlNifResourceFlags)(ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER);
NODE_RESOURCE = enif_open_resource_type(env, "linkedlist_nif",
"node_resource",
&node_dtor,
flags,
0);
}
new / 0 сопоставляется с этим NIF:
static ERL_NIF_TERM new_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
ERL_NIF_TERM term;
Node *Head = (Node *)enif_alloc_resource(NODE_RESOURCE,sizeof(Node));
Head->Next = 0;
term = enif_make_resource(env, Head);
enif_release_resource(Head);
return enif_make_tuple2(env, enif_make_atom_len(env, "ok", 2), term);
}
, и метод destruct-or для ресурса выглядит следующим образом:
static void node_dtor(ErlNifEnv* env, void* arg)
{
Node* handle = (Node*)arg;
enif_release_resource(handle);
handle = NULL;
}