Erlang enif_alloc_resource 总是分段错误
Erlang enif_alloc_resource always segmentation fault
我写了一个 c nif
代码,当我调用函数 find_next
时,erlang vm 退出并出现第 struct Node *n = (struct Node*) enif_alloc_resource(MEM_RESOURCE, sizeof(Node));
.
行的分段错误
C代码:
struct Node {
int n;
int* elems;
int c;
} Node;
static ErlNifResourceType *MEM_RESOURCE;
static ERL_NIF_TERM find_next_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
int len;
const ERL_NIF_TERM *args;
if (!enif_get_tuple(env, argv[0], &len, &args))
return enif_make_badarg(env);
struct Node *n = (struct Node*) enif_alloc_resource(MEM_RESOURCE, sizeof(Node));
return enif_make_int(env, 0);
}
问题是什么?
确保在加载 NIF 时调用 enif_open_resource_type()。
在你的 NIF 声明中,第三个参数是 nif_load 在这个例子中:
ERL_NIF_INIT(your_nif, nif_funcs, nif_load, NULL, NULL, NULL);
在您的加载函数中,连同您所做的任何其他事情,您应该调用 enif_open_resource_type(),如下所示:
static int nif_load(ErlNifEnv * env, void ** priv_data, ERL_NIF_TERM load_info) {
...
MEM_RESOURCE = enif_open_resource_type(
env, NULL, "your_nif", NULL,
ERL_NIF_RT_CREATE, NULL);
我写了一个 c nif
代码,当我调用函数 find_next
时,erlang vm 退出并出现第 struct Node *n = (struct Node*) enif_alloc_resource(MEM_RESOURCE, sizeof(Node));
.
C代码:
struct Node {
int n;
int* elems;
int c;
} Node;
static ErlNifResourceType *MEM_RESOURCE;
static ERL_NIF_TERM find_next_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
int len;
const ERL_NIF_TERM *args;
if (!enif_get_tuple(env, argv[0], &len, &args))
return enif_make_badarg(env);
struct Node *n = (struct Node*) enif_alloc_resource(MEM_RESOURCE, sizeof(Node));
return enif_make_int(env, 0);
}
问题是什么?
确保在加载 NIF 时调用 enif_open_resource_type()。
在你的 NIF 声明中,第三个参数是 nif_load 在这个例子中:
ERL_NIF_INIT(your_nif, nif_funcs, nif_load, NULL, NULL, NULL);
在您的加载函数中,连同您所做的任何其他事情,您应该调用 enif_open_resource_type(),如下所示:
static int nif_load(ErlNifEnv * env, void ** priv_data, ERL_NIF_TERM load_info) {
...
MEM_RESOURCE = enif_open_resource_type(
env, NULL, "your_nif", NULL,
ERL_NIF_RT_CREATE, NULL);