【问题标题】:Erlang enif_alloc_resource always segmentation faultErlang enif_alloc_resource 总是分段错误
【发布时间】:2023-03-26 09:20:01
【问题描述】:

我编写了一个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);
}

有什么问题?

【问题讨论】:

  • 你有没有在某处调用 enif_open_resource_type()?
  • 哦,我忘了。 Tnx!

标签: c erlang


【解决方案1】:

确保在加载 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);

【讨论】:

    猜你喜欢
    • 2018-04-10
    • 2010-10-24
    • 1970-01-01
    • 2020-01-07
    • 2022-01-21
    • 2011-10-02
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    相关资源
    最近更新 更多