私はすべて1)NIFライブラリをロードし、2)新しい/ 0メソッドを実行し、3)F()ですべてを解放してから、 4)erlang:ガベージ:collect()私がメモリに関して始まったところに戻るだろう。実際、私は記憶を漏らしています。明らかに、私のコードは、最も可能性の高い容疑者です。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);
}
と:オンロード
typedef struct Node
{
int Key;
ERL_NIF_TERM TermPtr;
struct Node *Next;
} Node;
私は、リソース
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);
}
新しい/ 0このNIFにマッピングされます開きますdestructまたはリソースの場合は、次のようになります。
static void node_dtor(ErlNifEnv* env, void* arg)
{
Node* handle = (Node*)arg;
enif_release_resource(handle);
handle = NULL;
}
もっと簡単なアプローチ履歴にストア値を避ける方法: 'A = your_nif:new()、ok.' –