Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C luajit ffi实现块终结器_C_Lua_Libcurl_Ffi_Luajit - Fatal编程技术网

C luajit ffi实现块终结器

C luajit ffi实现块终结器,c,lua,libcurl,ffi,luajit,C,Lua,Libcurl,Ffi,Luajit,我在luajit ffi做包裹libcurl的工作。我的终结器没有接到电话 local ffi = require("ffi") ffi.cdef [[ typedef struct{} CURL; CURL * curl_easy_init(); void curl_easy_cleanup(CURL *); ]] local CURL_lib = ffi.load("../lib/libcurl.so") local CURL_CTX local CURL_CTX_mt =

我在luajit ffi做包裹libcurl的工作。我的终结器没有接到电话

local ffi = require("ffi")

ffi.cdef [[
  typedef struct{} CURL;
  CURL * curl_easy_init();
  void curl_easy_cleanup(CURL *);
]]

local CURL_lib = ffi.load("../lib/libcurl.so")
local CURL_CTX

local CURL_CTX_mt = {
  __gc = function()  print "finalizing"; CURL_lib.curl_easy_cleanup(CURL_CTX); end
}

ffi.metatype("CURL", CURL_CTX_mt)

CURL_CTX = ffi.new("CURL[1]")
CURL_CTX = CURL_lib.curl_easy_init();
print "done"
我错过了什么D

顺便说一句,CURL定义为typedef void CURL;我确信我尝试的方式不够干净。有什么建议吗


尤里卡!:自我回答-如果有任何明显的问题,仍然对注释感兴趣。

luajit中的编译时类型必须是结构或联合。我认为,如果您将上下文类型初始化为指针,它就不再是结构。所以,这里有一个概念不匹配。因此,要解决问题,可以在结构中添加void*,将元类型挂起在结构上,并将void*用于库上下文

local ffi = require("ffi")

ffi.cdef [[
  typedef struct { void * ctx; } curl;
  curl * curl_easy_init();
  void curl_easy_cleanup(curl *);
]]

local curl_lib = ffi.load("../lib/libcurl.so")
local curl

local curl_mt = {
  __gc = function()  curl_lib.curl_easy_cleanup(curl.ctx); end
}

local curl_proto = ffi.metatype("curl", curl_mt)

curl = curl_proto(nil)
curl.ctx = curl_lib.curl_easy_init();

luajit中的编译时类型必须是结构或联合,我认为如果将上下文类型初始化为指针,它就不再是结构。所以,这里有一个概念不匹配。因此,要解决问题,可以在结构中添加void*,将元类型挂起在结构上,并将void*用于库上下文

local ffi = require("ffi")

ffi.cdef [[
  typedef struct { void * ctx; } curl;
  curl * curl_easy_init();
  void curl_easy_cleanup(curl *);
]]

local curl_lib = ffi.load("../lib/libcurl.so")
local curl

local curl_mt = {
  __gc = function()  curl_lib.curl_easy_cleanup(curl.ctx); end
}

local curl_proto = ffi.metatype("curl", curl_mt)

curl = curl_proto(nil)
curl.ctx = curl_lib.curl_easy_init();

或者,您可以在返回的指针上注册终结器,如下所示:

local ffi = require("ffi")

ffi.cdef [[
    typedef struct{} CURL;
    CURL * curl_easy_init();
    void curl_easy_cleanup(CURL *);
]]

local CURL_lib = ffi.load("../lib/libcurl.so")

local function curl_pointer_finalizer(pointer)
    print "finalizing"
    CURL_lib.curl_easy_cleanup(pointer)
end

local function curl_easy_init()
    return ffi.gc(CURL_lib.curl_easy_init(), curl_pointer_finalizer)
end

local CURL_CTX = curl_easy_init() -- wrapper func
print "done"

或者,您可以在返回的指针上注册终结器,如下所示:

local ffi = require("ffi")

ffi.cdef [[
    typedef struct{} CURL;
    CURL * curl_easy_init();
    void curl_easy_cleanup(CURL *);
]]

local CURL_lib = ffi.load("../lib/libcurl.so")

local function curl_pointer_finalizer(pointer)
    print "finalizing"
    CURL_lib.curl_easy_cleanup(pointer)
end

local function curl_easy_init()
    return ffi.gc(CURL_lib.curl_easy_init(), curl_pointer_finalizer)
end

local CURL_CTX = curl_easy_init() -- wrapper func
print "done"

如果你自己发现了一个答案,你应该把它作为一个真实的答案发布并接受它。啊,我想你必须等待一段时间,然后才能完成自我回答。谢谢Aah您在2天内无法接受自己的答案。如果您自己发现了答案,您应该将其作为实际答案发布并接受。Aah我认为您必须等待一段时间才能完成自我回答。谢谢啊,两天之内你不能接受你自己的答案。