首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >外部功能:谁释放记忆?

外部功能:谁释放记忆?
EN

Stack Overflow用户
提问于 2018-01-29 09:19:44
回答 1查看 89关注 0票数 3

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

问题

谁要为这段记忆的删除负责?

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

站在一边:

代码语言:javascript
复制
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绑定:

代码语言:javascript
复制
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")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-29 10:27:17

我认为不应该将GoString返回C,因为GoString的内存由go运行时管理,并且将被垃圾收集。在C区使用这个字符串是不可靠的。您应该做的是通过调用CString返回cs := C.CString(s)。C代码所做的内存分配不知道Go的内存管理器。所以我认为应该由你来管理哪一边来释放CString这里这里

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48497879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档