外函数:谁解除分配内存



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

问题

谁负责释放此内存?


下面是一个非常简单的示例。

去边:

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), ""
}

赛通绑定:

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")

我认为你不应该向C返回GoString。由于GoString的内存由 go 运行时管理,将被垃圾回收。在 C 语言中使用此字符串是不可靠的。您应该做的是通过调用 cs := C.CString(s) 返回CString。由 C 代码进行的内存分配对于 Go 的内存管理器来说是未知的。所以我认为由你来管理哪一边来释放CString,在这里和这里。

最新更新