【问题标题】:cgo do i need to free the memory for a variable returned by a C function to gocgo 我需要为 C 函数返回的变量释放内存吗?
【发布时间】:2017-01-10 07:36:50
【问题描述】:

我是 cgo 新手,有几个关于内存管理的问题。

假设我有一个简单的 c 函数如下:

char* get_str_in_arr(char **charArr, size_t i){
    return charArr[i];
}

我是否需要如下释放内存:

func doSomething(){
    cStr := C.get_str_in_arr(feats, C.size_t(1))
    goStr := C.GoString(cStr)
    defer C.free(unsafe.Pointer(cStr))
    ...
}

如果是这种情况,我是否需要对从方法返回的任何变量执行此操作。例如一个 c Struct, uint32_t, ...等

【问题讨论】:

    标签: c memory-management go cgo


    【解决方案1】:

    更多地用 C 语言而不是 Go 语言来思考它。如果您(从您的 C 函数)返回一个指向某些已分配内存(如在malloc() 中)的指针,则应该释放该指针(当然,如果它没有在 C 代码分配的其他内存中引用)。如果您要返回某个结构(不是指向该结构的指针)或整数 - 没有什么可以释放的。如果你要返回一个指向某个静态内存的指针——那不应该被释放。

    所以在你的例子中,问题是feats 是什么,它是如何分配的,它是如何管理的。鉴于当前的代码,对于是否需要 free() 返回值,我们无法给出明确的答案。

    【讨论】:

      猜你喜欢
      • 2018-07-29
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多