我正在从 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 绑定(bind):
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")
最佳答案
我认为你不应该将 GoString
返回给 C。因为 GoString
的内存由 go 运行时管理,并且将被垃圾收集。在 C 地使用这个字符串是不可靠的。您应该做的是通过调用 cs := C.CString(s)
返回一个 CString
。 Go 的内存管理器不知道由 C 代码进行的内存分配。所以我认为由您来决定释放 CString
,here 的哪一方和 here .
关于python - 外部函数 : who deallocates memory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48497879/