gpt4 book ai didi

c - 使用 enif_resource_alloc 正确释放内存

转载 作者:太空宇宙 更新时间:2023-11-04 03:58:10 24 4
gpt4 key购买 nike

我写了一个 Erlang C NIF,它在调用 new 后返回一个指向结构的指针,现在只是在插入时递增一个变量。我想知道如何正确销毁原始资源,或者至少将其标记为 GC。我运气不好。

#include <stdio.h> 
#include "erl_nif.h"


typedef struct level {
float a;
float b;
} LVL;

// data array with key being the price
typedef struct book {
int array_size; // # of TTL indices
int len; // # of Occupied indices (inc. val) from bestPriceIndex
int max_len;

LVL lvl_data[];

} Book;


static ErlNifResourceType *MEM_RESOURCE;


static int
on_load(ErlNifEnv *env, void **priv_data, ERL_NIF_TERM load_info)
{
ErlNifResourceFlags flags = (ErlNifResourceFlags)(ERL_NIF_RT_CREATE);

if ( (MEM_RESOURCE = enif_open_resource_type(env,
NULL,
"mem_resource",
NULL, //dtor
flags,
NULL)) == NULL)
return -1;

return 0;
}


static ERL_NIF_TERM
new( ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[] )
{
int max_len = 50;

int mem_size = sizeof(Book) + max_len * sizeof(LVL);
Book *q = enif_alloc_resource(MEM_RESOURCE, mem_size );
if( q == NULL ) return enif_make_string(env, "could not alloc", ERL_NIF_LATIN1);

q->lvl_data[0].a = 7.0;

ERL_NIF_TERM term = enif_make_resource(env, q);

enif_release_resource(q);

return term;
};


static ERL_NIF_TERM
insert( ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[] )
{
Book *p;
if (!enif_get_resource(env, argv[0], MEM_RESOURCE, (void **)&p))
return enif_make_badarg(env);

float x = ++p->lvl_data[0].a;

return enif_make_string(env, "okk", ERL_NIF_LATIN1);
};


static ErlNifFunc nif_funcs[] =
{
{"new", 0, new},
{"insert", 1, insert}
};

ERL_NIF_INIT( test, nif_funcs, on_load, NULL, NULL, NULL )

最佳答案

当没有持有资源的条款时,GC 将自动收集资源。

关于c - 使用 enif_resource_alloc 正确释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14554658/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com