C -Julia:ptr {void}最终器错误



我正在学习朱莉娅,我正在尝试写一个libpq(postgresql c库)包装器。

C PQconnectdb函数启动了PostgreSQL连接,并返回指向连接结构的指针。连接结构不受LIBPQ暴露,因为它没有用。连接完成后,必须使用C函数PQfinish关闭它,除其他外,该函数必须谨慎地释放结构内存。

所以我想当连接通过GC完成时,我应该调用PQfinish函数,这是以下代码的目的(Julia版本:0.3.0-744〜UBUNTU13.10.1):

module LibPQ
  typealias PGconn Ptr{Void}
  function pgconn_finalizer(x::PGconn)
    ccall( (:PQfinish, "libpq"), Void, (PGconn,), x )
    println("finalized")
  end
  c = ccall( (:PQconnectdb, "libpq"), PGconn, (Ptr{Uint8},), "connection params" )
  finalizer(c, pgconn_finalizer)
  println(c)
  gc()
end

但是我得到了这个错误:

$ julia libpq.jl
ERROR: objects of type Ptr{None} cannot be finalized
 in finalizer at base.jl:103
 in include at boot.jl:240
while loading ./libpq.jl, in expression starting on line 12

我想我应该为 PGconn typealias使用另一种类型,但是我不知道哪一种。有什么想法吗?

作为建议的朱莉娅 - dev邮寄列表,该解决方案是指出带有指针句柄的新类型,该类型将由PQfinish释放,如下所示:

module LibPQ
  type PGconn
    handle::Ptr{Void}
  end
  function pgconn_finalizer(c::PGconn)
    if c.handle != C_NULL
      ccall( (:PQfinish, "libpq"), Void, (Ptr{Void},), c.handle )
      c.handle = C_NULL
    end
    println("finalized")
  end
  c = ccall( (:PQconnectdb, "libpq"), PGconn, (Ptr{Uint8},), "connection params" )
  finalizer(c, pgconn_finalizer)
  println(c)
  gc()
end

相关内容

最新更新