外来功能:谁解除内存?

时间:2018-01-29 09:19:44

标签: python go memory-management cython

我正在从Python调用Go函数。 Go函数返回一个字符串,具体来说是一个GoString,其中字符串本身是在Go的一侧分配的。

问题

谁负责释放这段记忆?

以下是一个非常简化的例子。

走边:

func Create(optsEncoded string) (res string, serr string) {
    opts := map[string]interface{}{}
    if err := json.Unmarshal([]byte(optsEncoded), &opts); err != nil {
        return "", errWithStack(err)
    }
    options := translateCreateOptions(opts)

    result := ...

    payload, err := json.Marshal(result)
    if err != nil {
        return "", errWithStack(err)
    }
    return string(payload), ""
}

Cython绑定:

cpdef object py_create(object items, bytes options):
    cdef GoString opts = ...
    cdef bytes message

    cdef Create_return result = Create(opts)

    if result.r0.n == 0:
        message = result.r1.p
        raise Exception("Something happened")
    message = result.r0.p
    # Do I need to deallocate result.r0 and result.r1?
    return message.decode("utf-8")

1 个答案:

答案 0 :(得分:4)

我认为你不应该将GoString返回给C.因为GoString的内存由go运行时管理并且将被垃圾收集。在C土地上使用这个字符串是不可靠的。您应该做的是通过致电CString返回cs := C.CString(s)。 Go代码不知道C代码所做的内存分配。因此,我认为由您决定将CStringherehere释放到哪一方。